<< 2010/01/22 | Home | 2010/01/24 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

分割コンパイルすると、AbstractMethodError

$ scala -version
Scala code runner version 2.8.0.r20633-b20100122020238 -- Copyright 2002-2010, LAMP/EPFL
--- src/Parser.scala ---
class Parser {
  def parse(t: Any): Unit = {
  }
}

--- src/ResponseCommon.scala ---
trait ResponseCommon extends Parser {
  private[this] var paramsParser: Parser = null
  def withParamsParser(parser: Parser) = {paramsParser = parser; this}

  override abstract def parse(t: Any): Unit = t match {
    case ("params", value: List[_]) => value.foreach {paramsParser.parse(_)}
    case _ => super.parse(t)
  }
}

--- src2/MyResponseCommon.scala ---
class MyResponseCommon extends Parser with ResponseCommon

object MyResponseCommon {
  def main(args: Array[String]) {
    new MyResponseCommon
  }
}

別々にコンパイルすると、

mkdir -p classes/out
scalac -d classes/out src/*.scala
mkdir -p classes/out2
scalac -cp classes/out -d classes/out2 src2/*.scala
scala -cp classes/out:classes/out2 MyResponseCommon

AbstractMethodErrorになる。

java.lang.AbstractMethodError: MyResponseCommon.ResponseCommon$$paramsParser_$eq(LParser;)V
        at ResponseCommon$class.$init$(ResponseCommon.scala:2)
        at MyResponseCommon.(MyResponseCommon.scala:1)
        at MyResponseCommon$.main(MyResponseCommon.scala:5)
        at MyResponseCommon.main(MyResponseCommon.scala)

1回でコンパイルすれば、

mkdir -p classes/out
scalac -d classes/out src/*.scala src2/*.scala
scala -cp classes/out:classes/out2 MyResponseCommon

問題無し。バグ報告してみた。なんか内容が化けてしまった。ファイル添付しといたから、分かるかな。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8