vda*_*888 27 java generics arraylist
我有课A
,B
,C
和D
那里B
延伸A
,C
扩展A
和D
延伸A
.
我有以下ArrayList
几个,其中包含一些元素:
ArrayList<B> b;
ArrayList<? extends A> mix = b;
Run Code Online (Sandbox Code Playgroud)
我打算让变量mix
包含类型的元素B
,C
或D
.我试图类型的元素加入C
到mix
这样的:
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>
.
无法在使用的集合中添加元素? extends
.
ArrayList<? extends A>
意味着这是一种扩展ArrayList
的类型(恰好是一种类型)A
.所以,你可以肯定,当你调用get
方法,你会得到的东西是 A.但你不能添加的东西,因为你不知道究竟包含ArrayList
.
我使用
<? 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泛型是一种编译时强类型检查.编译器使用泛型来确保您的代码不会将错误的对象添加到集合中.
您尝试添加C
在ArrayList<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)
归档时间: |
|
查看次数: |
34278 次 |
最近记录: |