Set<Object> removedObjs = new HashSet<>();
List<? extends MyEntity> delObjs = (List<? extends MyEntity>) new ArrayList<>(removedObjs);
MyEntity
是标记界面。
上面的代码在java-7(java版本&#34; 1.7.0_91&#34;,确切地说)中工作正常但不在java-8中(java版本&#34; 1.8.0_77& #34)
在Java8中,我遇到以下异常:
incompatible types: ArrayList<Object> cannot be converted to List< ? extends MyEntity>
答案 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);