[英]Java 8 Incompatible Types Error
Set<Object> removedObjs = new HashSet<>();
List<? extends MyEntity> delObjs = (List<? extends MyEntity>) new ArrayList<>(removedObjs);
MyEntity
是标记接口。
上面的代码在Java-7 (准确地说是Java版本“ 1.7.0_91”)中可以正常工作,但在Java-8 (Java版本“ 1.8.0_77”中)却不能正常工作
在Java8中,出现以下异常:
incompatible types: ArrayList<Object> cannot be converted to List< ? extends MyEntity>
您的代码在Java 7和Java 8中均不起作用,因为您试图将ArrayList<Object>
(从构造方法返回的类型)转换为List<? extends MyEntity>
List<? extends MyEntity>
,即使在编译时也没有任何意义(请参阅此问题 )。 这就是编译器抱怨的原因。
以下代码将编译:
Set<Object> removedObjs = new HashSet<>();
List<? extends Integer> delObjs = (List) new ArrayList<>(removedObjs);
但是,由于您正在执行不安全的转换,因此编译器将发出警告。
编辑:@Tom指出:
“您的代码在Java 7中不起作用”,它不应该,但是它起作用了,因为在该版本中编译器检查仍然有些错误。 此问题已在Java 8中修复,因此现在失败了。
Java 8在类型推断和相关主题方面进行了很多更改。 因此,如果某些边缘情况(例如遮荫的演员)突然变得无效也就不足为奇了。
不管是什么原因,您仍然可以投射列表,但是比以前更加难看:
(List<? extends MyEntity>) (List) new ArrayList<>(removedObjs);
正如彼得·劳瑞(Peter Lawrey)的评论所指出的那样,这可以写得更短:
(List) new ArrayList<>(removedObjs);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.