通用扩展不能添加相同的类型
我是这些通用类型的新手。 在下面的代码中,我创建了一个接受扩展“String”的项列表的方法。
我的问题? – 当列表可以分配一个新列表时,为什么不能添加字符串“test”…它给了我一个编译错误。
public class Child { public void takeList(List list){ list = new ArrayList(); list.add("test"); } }
因为它不是与此相关的运行时类型。 list
仍然是List extends String>
List extends String>
,你刚刚把它分配给一个new ArrayList
。 考虑一下:
list = rand() ? new ArrayList() : new ArrayList();
编译器无法判断list.add("test")
是否有效 – 它只根据编译时类型的list
做出决策。
请注意,实际上没有任何扩展String
,它是final
类。
有一个微妙的区别。 它需要一个包含一种类型的东西的列表(一个扩展字符串的东西)。 此列表可能是String的子类,因此不是String iyswim。 请参阅http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html上限有界通配符。
如果它是
public void takeList(List *super* String> list){
然后你可以添加字符串,因为列表保证能够接受字符串。
当您拥有带通配符的变量以及采用generics类型参数的方法时,Java无法确保类型安全。 它必须禁止这个电话。
考虑List extends Animal>
例如, List extends Animal>
。 您可能已将其分配给List
,但可以为变量分配List
。 不应该允许您将Dog
添加到此类列表中。
要允许调用add
方法,请删除通配符。
public void takeList(List list){
此外, String
是final
,所以真的没有必要说? extends String
? extends String
。