我看到在Eclipse中的行为和javac之间为下面的代码有很大的差异:铸造泛型类是Eclipse,但错误警告中的javac
public class TestIncompatibleTypes {
private static <V> void libraryMethod(Class<? extends List<V>> in) {}
public static void main(String[] args) {
// Eclipse warns about 'Unchecked cast'
// Maven fails with 'incompatible types'
Class<? extends List<String>> l = (Class<? extends List<String>>) ArrayList.class;
libraryMethod(l);
}
}
的Eclipse发布“选中投”针对上述警告代码,但它成功编译。 Javac生成一个错误:
$ java -version
openjdk version "1.8.0_72-internal"
OpenJDK Runtime Environment (build 1.8.0_72-internal-b15)
OpenJDK 64-Bit Server VM (build 25.72-b15, mixed mode)
$ javac -version
javac 1.8.0_72-internal
$ javac -source 8 TestIncompatibleTypes.java
TestIncompatibleTypes.java:13: error: incompatible types: Class<ArrayList> cannot be converted to Class<? extends List<String>>
Class<? extends List<String>> l = (Class<? extends List<String>>) ArrayList.class;
^
1 error
任何人都可以解释为什么javac不允许演员?我的理解是,类型擦除后它们应该完全等效。
是否有解决方法让这两个编译器上编译?
只要你使用未经检查的铸造,那么'Class <?扩展列表> l =(Class)ArrayList.class;'? –
khelwood