新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。もう新人じゃないかも…

学習記録:Scala逆引きレシピ

第10章:Javaとの連携

ScalaからJavaを扱う

Javaのクラスを呼び出す

Javaのクラスは、new演算子で生成し、Scalaと同様の書式でメソッドを呼び出すことができる。

import java.io.File

val file = new File("hoge.txt")

val flag = if (file.exists) file.delete ( ) else false
val temp = File.createTempFile("temp", "tmp")
継承・実装

Javaのクラスの継承は、Scalaの継承と同じくextendsキーワードを使う。
なお、スーパークラスで定義されているstaticメンバを参照するには、スーパークラスのクラス名を使う必要がある。

class SampleThread extends Thread {
  override def run = {
    // MAX_PRIORITYはスーパークラスであるThreadを使って参照する必要
    this.setPriority(Thread.MAX_PRIORITY)
    ...
  }
}

Javaのインタフェースの実装は、こちらもScalaのミックスインと同じくwithまたはextendsキーワードを使う。

class SampleThread extends Runnable {
  ...
|

// 別に継承クラスがある場合はwith
class SampleThread2 extends SuperClass with Runnable {
  ...
}
||<<

*** コレクションの変換
scala.collection.JavaConversions/JavaConvertersを使うことで、コレクションの相互変換が可能。
ScalaではJavaのコレクションをそのまま利用できるが、ループ処理時などはScalaのコレクションに変換した方が便利。

- JavaConversions
こちらは暗黙の型変換によって自動的に変換を行う。
>|scala|
import scala.collection.JavaConversions._

val list = new java.util.AraryList[String]
list.add("Scala")

// 暗黙的に変換される
list.foreach { e =>
  println(e)
}
  • JavaConverters

こちらは明示的なメソッド呼び出しによって変換する。

import scala.collection.JavaConverters._

val list = new java.util.AraryList[String]
list.add("Scala")

// asScalaメソッド実行で変換する
list.asScala.foreach { e =>
  println(e)
}

なお、あくまで変換は単なるラッパーでしかないので、
例えばイミュータブルなListをJavaのListに変換した場合、要素の変更はできないことに注意。

JavaからScalaを使う

クラス/オブジェクトの呼び出し

同様に、JavaからScalaのクラスを呼び出す場合、new演算子で生成して呼び出す。

// Scalaのケースクラス: case class Book(titile:String, price: Int)
Book book = new Book("title", 1000);

なお、Scalaの+や-メソッドは、Javaで使用可能な名前に変換されていることに注意。
例)+: plusメソッド、-: minusメソッド

Singletonのインスタンスには、オブジェクト名でアクセスし、メソッドはstaticメソッドのように扱う。

// scalaのオブジェクト: object Format { def format(input: String) ... }
Format.format("hello");
ScalaのクラスをJavaBeanとして扱う

Scalaのクラスのフィールドに@scala.reflect.BeanPropertyを付与することで、
JavaBeans形式のアクセサメソッドgetter/setterが生成される。

import scala.reflect.BeanProperty

case class Book {
  @BeanProperty var title: String,
  @BeanProperty var price: Int)

上記BookクラスをJavaから利用したのが以下。

Book book = new Book("title", 1000);

book.getTitie();
book.setPrice(1500);
Scalaの例外を処理する

Scalaメソッドに@throwsを付与する。

class SampleScalaClass {
  @throws(classOf[Exception])
  def output: Unit = ...
}

上記のように書くと、Javaからはthrows IOExceptionが宣言されているように見える。

public class SampleJavaClass {
  public static void main(Stirng[] args) {
    SampleScalaClass ssc = new SampleScalaClass();
    try {
      ssc.output();
    } catch (Exception e) {
      ...
    }
  }
}
javaコマンドでScalaプログラムを実行する

Scalaプログラムをコンパイルすると、Java VM上で動作するクラスファイルが生成される。
このクラスファイルをjavaコマンドで実行するには、Scalaのインストールディレクトリ/libにある
scala-library.jarをクラスパスに追加する必要があるので注意。