Java 8不兼容的类型错误

LAX*_*JAN 7 java java-7 java-8

Set<Object> removedObjs = new HashSet<>();
List<? extends MyEntity> delObjs = (List<? extends MyEntity>) new ArrayList<>(removedObjs);
Run Code Online (Sandbox Code Playgroud)

MyEntity 是标记界面.

上面的代码在(java版本"1.7.0_91",准确)中工作正常,但在(java版本"1.8.0_77")中没有

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

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

小智 11

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

以下代码将编译:

Set<Object> removedObjs = new HashSet<>();
List<? extends Integer> delObjs = (List) new ArrayList<>(removedObjs);
Run Code Online (Sandbox Code Playgroud)

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

编辑:@Tom指出:

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

  • *"你的代码不应该在java 7中工作"*它不应该,但它有效,因为编译器检查在该版本中仍然有点错误.这已在Java 8中修复,这就是它现在失败的原因.(只是一张纸条) (14认同)

Sma*_*ker 8

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

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

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

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

(List) new ArrayList<>(removedObjs);