我有一个List<? extends MyClass> list
,我想在此列表中添加类扩展为MyClass
的对象和作为MyClass
实例的对象:
list.add(new ClassThatExtendsMyClass());
list.add(new MyClass());
但是eclipse显示了构建错误:
方法add(捕获#9-of?extends MyClass)中的 类型列表不是 适用于参数(MyClass)
我怎样才能解决这个问题?
答案 0 :(得分:2)
您可以将引用声明为List<MyClass>
。
您可以添加MyClass
的任何内容,包括MyClass
的实例。
答案 1 :(得分:2)
泛型类型的引用中的Java关键字 extends 用于将实际泛型类型实现限制为不低于命名类型。特别是它可以是一个子类。如果使用提取值并对其进行操作,则应使用它。然后,您可以使用基类的接口,而不是该类的实际类型(实现/实现)。
当你有一个特定的类并且需要传递(put)到集合或其他泛型类对象时,指向该对象的引用应该具有 super < / strong> keyword,它将实际对象限制为不再派生,而不是命名类型。
下面的代码示例。假设我们有类Base
和Derived
,其中Derived extends Base
,类Base
具有接口方法foo()
,并且都具有默认构造函数。
void service() {
List<Base> theList = new ArrayList<Base>();
produceObjects(theList);
consumeObjects(theList);
}
void produceObjects(List<? super Base> consumerList) {
consumerList.add(new Derived());
}
void consumeObjects(List<? extends Base> producerList) {
for (Base base : producerList) {
base.foo();
}
}
答案 2 :(得分:1)
这是不可能的。 List<? extends MyClass> list
实际上可以指向ArrayList<ClassThatExtendsMyClass>
。哪个不能保存MyClass的其他子类的实例。
List<? extends Number> numbers = new ArrayList<Integer>();
numbers.add(Long.valueOf(2)); // not possible since 'Integer' array can't hold Longs
如果你想添加内容,你应该声明你的变量&#39; list&#39;为List<? super MyClass>
。这将使您能够添加&#39; MyClass&#39;的任何子类。进入清单。
List<? super Number> numbers = new ArrayList<Number>();
numbers.add(Long.valueOf(2));
这被称为&#39; get&#39;和&#39;放&#39;原理。如果你想获得&#39;你需要使用List<? extends MyClass>
语法的东西,如果你想放置&#39;您需要具有List<? super MyClass>
语法的东西。当然,如果您需要同时执行这两项操作,则需要使用List<MyClass>
语法。
答案 3 :(得分:0)
试试这个:
List<MyClass>
应该有效
答案 4 :(得分:-1)
以这种方式定义:
List<MyClass> list