【发布时间】:2016-04-21 15:31:51
【问题描述】:
对于以下代码,我发现 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<? extends List<String>> l = (Class) ArrayList.class;呢?