带有ArrayList的Java Generic <?扩展A>添加元素

vda*_*888 27 java generics arraylist

我有课A,B,CD那里B延伸A,C扩展AD延伸A.

我有以下ArrayList几个,其中包含一些元素:

ArrayList<B> b;
ArrayList<? extends A> mix = b;
Run Code Online (Sandbox Code Playgroud)

我打算让变量mix包含类型的元素B,CD.我试图类型的元素加入Cmix这样的:

mix.add(anElementOfTypeC);
Run Code Online (Sandbox Code Playgroud)

但IDE不允许我这样做,它说:

通过调用转换的方法,无法将anElementOfTypeC转换为CAP#1,其中CAP#1是一个新的类型变量:CAP#1从捕获?延伸A.

我使用<? extends A>得当吗?我该如何解决这个问题?

SLa*_*aks 39

ArrayList<? extends A>表示扩展的某种未知类型的ArrayList A.
该类型可能不是C,因此您无法添加C到ArrayList.

实际上,由于您不知道ArrayList应包含的内容,因此无法向ArrayList 添加任何内容.

如果您想要一个可以包含任何继承类的ArrayList A,请使用ArrayList<A>.

  • 不能添加任何东西有点太严格.我们可以添加`null`,或者我们可以将`list.get(0)`添加回列表.我知道我选的太多了.;) (4认同)
  • @RohitJain:不,你不能将`list.get(0)`添加回列表 (3认同)
  • @JBNizet:我知道你在谈论什么; 但这不是评论的主题所说的.那是`List <T>`,而不是`List <?扩展A>`,这是评论的主题. (2认同)

Dmi*_*sev 8

无法在使用的集合中添加元素? extends.

ArrayList<? extends A>意味着这是一种扩展ArrayList的类型(恰好是一种类型)A.所以,你可以肯定,当你调用get方法,你会得到的东西 A.但你不能添加的东西,因为你不知道究竟包含ArrayList.


Ole*_*ndr 6

我使用<? extends A>得当吗?

List<? extends A> list;表示'list'指的是一个对象实现的接口List,该列表可以包含从A类继承的元素(包括A).换句话说,以下陈述是正确的:

List<? extends A> listA1 = new ArrayList<A>();
List<? extends A> listB1 = new ArrayList<B>();
List<? extends A> listC1 = new ArrayList<C>();
List<? extends A> listD1 = new ArrayList<D>();
Run Code Online (Sandbox Code Playgroud)

Java泛型是一种编译时强类型检查.编译器使用泛型来确保您的代码不会将错误的对象添加到集合中.

您尝试添加CArrayList<B>

listB1.add(new C());
Run Code Online (Sandbox Code Playgroud)

如果允许,则对象ArrayList<B>将包含不同的对象类型(B,C).
这就是参考 listB1以'只读'模式工作的原因.另外你可以看看这个答案.

怎么解决这个?

List<A> list = new ArrayList<A>();
Run Code Online (Sandbox Code Playgroud)