为什么我不能将SuperType添加到List <t>,其中<t extends =“”supertype =“”>?</t> </t>

时间:2013-07-31 10:09:18

标签: java generics

使用

public class SuperType {
}

public class TestClass<T extends SuperType > {

    public void doSomething() {
        List<T> list = new ArrayList<T>();
        list.add(new SuperType ()); // ERROR
    }
}

它不会编译,给我

  

类型List中的方法add(T)不适用于参数(SuperType)

但为什么?

4 个答案:

答案 0 :(得分:7)

假设你有

public class SuperType {
}

public class SubType extends SuperType {
}

并使用TestClass<SubType>您的代码

public class TestClass<SubType> {

    public void doSomething() {
        List<SubType> list = new ArrayList<SubType>();
        list.add(new SuperType ());
    }
}

这必须是错误的,因为new SuperType()不够具体。它必须至少为SubType

答案 1 :(得分:4)

该类型仅适用于SuperType的子类,但不适用于SuperType本身。而是使用

List<SuperType> list = new ArrayList<SuperType>();
list.add(new SuperType ()); 

答案 2 :(得分:4)

你应该有 -

  

SuperType无法通过方法调用转换转换为T

在实现中使用类型声明的含义无效。

当你说 -

T extends SuperType

您实际上是说该参数可以是SuperType或SuperType的任何子类型。

应该是 -

List<SuperType> list = new ArrayList<SuperType>();

答案 3 :(得分:0)

类型仅用于表示它可以是什么类型,在您的情况下,它可以是任何类型,它是SuperType和Supertype本身的子类。

由于