通用扩展不能添加相同的类型

我是这些通用类型的新手。 在下面的代码中,我创建了一个接受扩展“String”的项列表的方法。

我的问题? – 当列表可以分配一个新列表时,为什么不能添加字符串“test”…它给了我一个编译错误。

public class Child { public void takeList(List list){ list = new ArrayList(); list.add("test"); } } 

因为它不是与此相关的运行时类型。 list仍然是List List ,你刚刚把它分配给一个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 list){ 

然后你可以添加字符串,因为列表保证能够接受字符串。

当您拥有带通配符的变量以及采用generics类型参数的方法时,Java无法确保类型安全。 它必须禁止这个电话。

考虑List 例如, List 。 您可能已将其分配给List ,但可以为变量分配List 。 不应该允许您将Dog添加到此类列表中。

要允许调用add方法,请删除通配符。

 public void takeList(List list){ 

此外, Stringfinal ,所以真的没有必要说? extends String ? extends String