Java 8不兼容的类型错误

时间:2016-05-16 08:13:36

标签: java java-8 java-7

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

MyEntity是标记界面。

上面的代码在(java版本&#34; 1.7.0_91&#34;,确切地说)中工作正常但不在中(java版本&#34; 1.8.0_77& #34)

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

  

incompatible types: ArrayList<Object> cannot be converted to List< ? extends MyEntity>

2 个答案:

答案 0 :(得分:11)

您的代码既不能在Java 7中工作,也不能在Java 8中工作,因为您试图将ArrayList<Object>(从构造函数返回的类型)转换为List<? extends MyEntity>,即使在编译时也没有意义时间(见this question)。这就是编译器抱怨的原因。

以下代码将编译:

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

但是,由于您执行的是不安全的转换,编译器将发出警告。

编辑:@Tom指出:

  

&#34;您的代码不适用于Java 7&#34;它不应该,但它起作用,因为编译器检查在该版本中仍然有点错误。这已在Java 8中修复,这就是它现在失败的原因。

答案 1 :(得分:8)

Java 8改变了类型推断和相关主题。因此,如果某些边缘情况(例如阴暗的演员表)突然变得无效,这就不足为奇了。

无论原因是什么,你仍然可以投射你的名单,但它比以前略显丑陋:

(List<? extends MyEntity>) (List) new ArrayList<>(removedObjs);

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

(List) new ArrayList<>(removedObjs);