2

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

4 回答 4

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 ());
    }
}

那必须出错,因为 anew SuperType()不够具体。它必须至少是一个SubType.

于 2013-07-31T10:27:00.583 回答
4

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

List<SuperType> list = new ArrayList<SuperType>();
list.add(new SuperType ()); 
于 2013-07-31T10:11:57.797 回答
4

你应该有一些符合-

SuperType不能通过方法调用转换为T

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

当你说-

T extends SuperType

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

应该-

List<SuperType> list = new ArrayList<SuperType>();
于 2013-07-31T10:14:45.490 回答
0

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

谢谢

于 2013-07-31T10:14:20.487 回答