【问题标题】:Java 8 Incompatible Types ErrorJava 8 不兼容类型错误
【发布时间】:2016-09-11 23:28:00
【问题描述】:
Set<Object> removedObjs = new HashSet<>();
List<? extends MyEntity> delObjs = (List<? extends MyEntity>) new ArrayList<>(removedObjs);

MyEntity是标记接口。

以上代码在(准确地说是java 版本“1.7.0_91”)中运行良好,但在(java 版本“1.8.0_77”)中运行良好

在 Java8 中,我收到以下异常:

incompatible types: ArrayList&lt;Object&gt; cannot be converted to List&lt; ? extends MyEntity&gt;

【问题讨论】:

  • 如果您删除&lt;&gt;,您应该只会收到一个警告。如果它在 Java 8 中不起作用,那么它可能不应该在 Java 7 中起作用。
  • 它可以在我的环境 JAVA1.8.0_92 中编译,只有警告:类型安全:从 ArrayList 到 List 但不能 javac
  • 查看代码,它不应该工作似乎是合乎逻辑的。只需在两行之间插入removedObjs.add("42"); 即可查看原因。
  • 是否有机会改进标题以使其对将来搜索此问题的人更有用?

标签: java-7 java-8 java java-8 java-7


【解决方案1】:

Java 8 在类型推断和相关主题方面发生了很大变化。因此,如果某些极端情况(例如 shady casts)突然变得无效也就不足为奇了。

不管是什么原因,你仍然可以投射你的名单,但它比以前稍微丑了一点:

(List&lt;? extends MyEntity&gt;) (List) new ArrayList&lt;&gt;(removedObjs);

正如 Peter Lawrey 的评论所指出的,这可以写得更短

(List) new ArrayList&lt;&gt;(removedObjs);

【讨论】:

【解决方案2】:

您的代码在 Java 7 和 Java 8 中都不应该工作,因为您试图将 ArrayList&lt;Object&gt;(从构造函数返回的类型)转换为 List&lt;? extends MyEntity&gt;,即使在编译时也没有任何意义(参见 @ 987654321@)。这就是编译器抱怨的原因。

以下代码将编译:

Set<Object> removedObjs = new HashSet<>();
List<? extends Integer> delObjs = (List) new ArrayList<>(removedObjs);

但是,由于您正在执行不安全的转换,编译器会抛出警告。

编辑:正如@Tom 指出的那样:

“您的代码不应该在 java 7 中工作”它不应该,但它工作,因为编译器检查在那个版本中仍然有点错误。这已在 Java 8 中修复,这就是它现在失败的原因。

【讨论】:

  • "您的代码不应该在 java 7 中工作" 它不应该,但它工作了,因为编译器检查在那个版本中仍然有点错误。这已在 Java 8 中修复,这就是它现在失败的原因。 (只是一个注释)
  • ^ 这应该添加到答案中。
  • @Tom:我手头没有jdk1.7.0_91,但我用jdk1.7.0_13jdk1.7.0_40jdk1.7.0_51jdk1.7.0_80和Eclipse(符合Java7)进行了测试.他们都没有接受问题的代码。
  • Java 语言规范不鼓励使用原始类型,除非使用泛型之前的遗留代码。另见stackoverflow.com/questions/2770321/…
猜你喜欢
  • 2013-09-23
  • 1970-01-01
  • 2016-04-12
  • 2013-10-29
  • 2011-08-26
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多