将BaseClass实例插入List <! - ?扩展BaseClass - >(Java)

时间:2014-10-10 16:11:39

标签: java list generics inheritance

我有一个List<? extends MyClass> list,我想在此列表中添加类扩展为MyClass的对象和作为MyClass实例的对象:

list.add(new ClassThatExtendsMyClass());
list.add(new MyClass());

但是eclipse显示了构建错误:

  

方法add(捕获#9-of?extends MyClass)中的   类型列表不是   适用于参数(MyClass)

我怎样才能解决这个问题?

5 个答案:

答案 0 :(得分:2)

您可以将引用声明为List<MyClass>

您可以添加MyClass的任何内容,包括MyClass的实例。

答案 1 :(得分:2)

泛型类型的引用中的Java关键字 extends 用于将实际泛型类型实现限制为不低于命名类型。特别是它可以是一个子类。如果使用提取值并对其进行操作,则应使用它。然后,您可以使用基类的接口,而不是该类的实际类型(实现/实现)。

当你有一个特定的类并且需要传递(put)到集合或其他泛型类对象时,指向该对象的引用应该具有 super < / strong> keyword,它将实际对象限制为不再派生,而不是命名类型。

下面的代码示例。假设我们有类BaseDerived,其中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