【发布时间】:2016-05-16 13:15:09
【问题描述】:
代码
import java.util.*;
interface Sample{
}
public class TypeTest implements Sample{
public static void main(String[] args) {
Set<Object> objs = new HashSet<>();
objs.add(new TypeTest());
List<? extends Sample> objList = (List<? extends Sample>) new ArrayList<>(objs);
for (Sample t : objList) {
System.out.println(t.toString());
}
}
}
它可以在eclipse中运行并输出TypeTest@7852e922但javac会报错:
incompatible types: ArrayList<Object> cannot be converted to List<? extends Sample>
【问题讨论】:
-
您的系统上是否安装了 2 个不同的 JDK?
-
什么版本的javac?您的 Eclipse 项目配置为使用什么 Java 级别?
-
顺便说一句,如果您使用最新版本的 Java (7+),我认为您甚至不需要演员表;编译器可以从变量声明中暗示实例化的类型参数。
-
我能够通过 jdk 1.8 和 Eclipse 4.5 使用相同的 jdk 重现此问题。问题似乎类似于...stackoverflow.com/q/2858799/1069114 和stackoverflow.com/q/3000177/1069114。
-
是的 Eclipse 允许这样做,是错误的。虽然老实说:钻石运算符加演员是不正当的。
标签: java eclipse list collections type-safety