<< 猫はなんで、箱が好きなんだろうね〜 | Home | 猫ページ更新完了 >>
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

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



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

さっそく返事があり、private[this]絡みのバグなのだそうだ。[this]を外してみたら、確かに起きない。とりあえずは、これでしのげそう。

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