Java泛型和转换
在Java泛型中,如果键入
List<Object> l = new ArrayList<>();
List<String> l2 = l; //no casting works here
它不会编译,报告不可转换的类型List<Object> to List<String>
。然而:
List<? extends Object> l = new ArrayList<>();
List<String> l2 = ( List<String> ) l;
List<String> l3 = ( List<String> ) l;
确实有效。为什么会这样
# 1 楼答案
这是因为
List<? extends Object>
可能实际上指的是List<String>
,因此编译器必须信任开发人员在第一种情况下,编译器知道强制转换会干扰其他代码的假设(即,可以将各种对象放入
l
中,l2
只包含字符串),因此能够拒绝强制转换同样(或类似)的情况也发生在普通对象上:
上述操作将失败,因为编译器知道
Integer
对象不可能被强制转换为String
但是,以下代码至少可以编译,因为编译器不知道
i
的实际类型(想想i
来自代码中的其他地方),因此编译器必须相信您知道自己在做什么# 2 楼答案
它不起作用,因为您正在将
List<Object>
分配给List<String>
然而,这些是不兼容的类型这是因为它在编译时检查
List<? extends Object>
是否可以强制转换为List<String>
当我们不使用
extends
关键字时,类型应该是精确的