Saturday 19 January 2008

Generic の verify error (Eclipse の java builder と ant)



なんか、どうも、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 が使えるようになるのはいつだろうね。

No comments: