创建类型对象的通用列表并添加字符串

use*_*619 0 java generics

我正在尝试创建一个通用列表,它将包含从Object继承的任何类型的项(我假设每个对象都是object类型).

但是,在下面的例子中,当我尝试添加一个String(从对象继承)时,它在Eclipse中显示错误

Error:-The method add(capture#1-of ? extends Object) in the type List<capture#1-of ? extends Object> is not applicable for the arguments (String)


List<? extends Object> alist = new ArrayList<Object>();
alist.add("USA");
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么我会收到此错误吗?

rge*_*man 6

原因是它<? extends Object>可能代表任何子类Object,可能与之无关String.它可能是List<Integer>.

List<? extends Object> alist = new ArrayList<Integer>();  // works
alist.add("USA");  // Should you be allowed to do this?  No!
Run Code Online (Sandbox Code Playgroud)

对于类型安全,您不应该执行此类add操作.因此,不允许此操作.

解决方法是在变量声明中消除通配符:

List<Object> alist = new ArrayList<Object>();
Run Code Online (Sandbox Code Playgroud)

现在Object可以传递任何或子类add.