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-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>
小智 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 8改变了类型推断和相关主题.因此,如果某些边缘情况(例如阴暗的演员表)突然变得无效,那就不足为奇了.
无论原因是什么,你仍然可以投射你的清单,但它比以前略显丑陋:
(List<? extends MyEntity>) (List) new ArrayList<>(removedObjs);
正如Peter Lawrey的评论所指出的那样,这可以写得更短
(List) new ArrayList<>(removedObjs);
归档时间: |
|
查看次数: |
1826 次 |
最近记录: |