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 が使えるようになるのはいつだろうね。
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735