繁体   English   中英

Java 8不兼容类型错误

[英]Java 8 Incompatible Types Error

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<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM