通过使用generics’extends’添加字符串会导致编译器错误
下面的代码:
List genericNames = new ArrayList(); genericNames.add("John");
给编译器错误:
此行中的多个标记 – 类型List中的方法add(捕获#1-of?extends String)不适用于参数(String) – 类型List中的方法add(capture#1-of?)不是适用于参数(String)
导致此错误的原因是什么? 我是否应该无法添加字符串或其子类型,因为我在类型参数中扩展String?
在扩展名中使用通配符时,除了null之外,不能在集合中添加任何内容。 另外,String是最后一个类; 没有什么可以扩展String。
原因:如果允许,您可能只是将错误的类型添加到集合中。
例:
class Animal { } class Dog extends Animal { } class Cat extends Animal { }
现在你有List extends Animal>
List extends Animal>
public static void someMethod(List extends Animal> list){ list.add(new Dog()); //not valid }
你调用这样的方法:
List catList = new ArrayList (); someMethod(catList);
如果在使用带扩展名的通配符时允许在集合中添加,则只需将Dog添加到仅接受Cat或子类型类型的集合中。 因此,您无法在使用带有上限的通配符的集合中添加任何内容。
String
是最终类,无法扩展。 此外,对于您似乎感兴趣的情况,您不需要extends关键字。 List
将执行您想要的操作。 这将允许String的字符串和子类(如果这样的东西可能存在,它不能,因为String是最终的)。
只想添加GanGnaMStYleOverFlow的答案,您可以将Animal
的任何子类型的对象添加到以下列表中:
List animals = new ArrayList ();
每当你认为它可以包含任何种类的动物时,你应该使用这样的清单。
另一方面,你应该使用List extends Animal>
当你想要指定列表包含某种动物但你不知道哪一种时, List extends Animal>
。 既然你不知道那里有什么动物,你就不能添加任何动物。