なんか、どうも、Eclipse のjava builder の方が Class のチェックが甘い。
class LogicNodeParser<N>
class MacroNodeParser<N> extends LogicNodeParser<N>
で、
MacroNodeParser<N> m;
LogicNodeParser<N> p;
m = (MacroNodeParser<ITLSolver>) p;
は、Eclipse の上では許してもらえるんだけど、
Exception in thread "main" java.lang.ClassCastException: parser.LogicNodeParser
at parser.LogicNodeParserTest.main(LogicNodeParserTest.java:24)
まぁ、そうだよね。これは、まぁ、良いです。
でも、動いちゃう場合もある。
public interface ITLNodeFactoryInterface<T>
public class ITLNodeParser<Node extends ITLSolver> {
public ITLNodeParser(ITLNodeFactoryInterface<Node> lf) ;
}
public class ITLNodeFactory implements ITLNodeFactoryInterface<ITLSolver> ;
で、
p = new ITLNodeParser<ITLSolver>(new ITLNodeFactory());
だと、Eclipse で生成すると動く。実行時エラーはでない。でも、ant でbuildすると、実行時に、
[java] Exception in thread "main" java.lang.VerifyError: (class: lite/ITLNodeParser, method: <init> signature: (Llite/ITLNodeFactoryInterface;)V) Bad type in putfield/putstatic
うーん、これは何故だ。(これだけだと再現しないかも知れないです...) 動くわけなので、一応、Generic は合ってはいるんだよな。
public interface ITLNodeFactoryInterface<T extends ITLSolver>
とすると動くので、一種の型推論不足らしい。
使っているjavac が異なるってこと? 確かに、Eclipse が作る class の方が大きいんだけど。
java -version
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-241)
Java HotSpot(TM) Client VM (build 1.5.0_13-121, mixed mode, sharing)
だけど、Eclipse は違うものを使っているんだろうか?
Mac 上で 1.6 が使えるようになるのはいつだろうね。