使用
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)
但为什么?
答案 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本身的子类。
由于