【发布时间】:2014-09-28 19:29:30
【问题描述】:
使用 Oracle Java SE 8u20 JDK 编译以下代码时,前三个赋值编译正常(对于 works* 变量),但第四个赋值(对于 fails1 变量)生成以下编译错误:
错误:
incompatible types: Set<Set<Object>> cannot be converted to Set<Set<? extends Object>>
代码:
import java.util.Set;
import java.util.Collections;
...
Set<? extends Object> works1 = Collections.<Object>emptySet();
Set<Set<Object>> works2 = Collections.<Set<Object>>emptySet();
Set<Set<? extends Object>> works3 = Collections.<Set<? extends Object>>emptySet();
Set<Set<? extends Object>> fails1 = Collections.<Set<Object>>emptySet();
我认为这是正确的(可能是由于 Java 语言规范中定义的某种类型擦除),而不是错误,但我不确定。
有谁知道为什么fails1 编译失败?对 Java 规范的适用部分或 JDK 错误报告的引用将不胜感激。
感谢您的帮助。
【问题讨论】:
-
它也不能在 Java 7 上编译。
-
请记住,类型擦除永远不是解决编译错误的方法,例如您当前的错误。在编译时没有擦除——所有类型信息都在那里。
-
我推荐阅读这个问答:stackoverflow.com/questions/3652718/…
-
@MarkoTopolnik:您的链接中的答案给了我解决方案,我将在下面回答。谢谢。
标签: java generics compilation type-erasure incompatibletypeerror