ScalaでJavaFXを使おうとしたときに、Javaとの互換性問題にあたりました。
builderパターンを使ったNodeオブジェクトの生成がScalaではコンパイルエラーになるのです。調べたところ、JIRAにはすでに報告されていてScala 2.11-M3が修正のターゲットになっているようでした。
https://issues.scala-lang.org/browse/SI-6169
ちなみに、builderパターンを使わずに、中括弧を用いてオブジェクトを初期化することができます。
new Rectangle {
setWidth(100d)
setHeight(200d)
setFill(Color.RED)
setStroke(Color.GOLD)
}
C#のオブジェクト初期化子に似ていますが、もっと柔軟性が高いです。
この中括弧の中で変数を定義することもメソッドの呼び出しもできます。
もっといえばメソッドの定義すらできます。
new Rectangle {
val w = 100d
val h = 200d
def getColor(n: Int): Color = n match {
case n if n > 0 => Color.RED
case _ => Color.GOLD
}
setWidth(w)
setHeight(h)
setFill(getColor(0))
setStroke(getColor(1))
}
ただし、これらには注意点もあって、型としてはRectangleではなくてRectangleを継承した匿名クラスを生成しています。