我正在尝试创建泛型类,它将获得类型(T),并且将包含List和方法,用于添加从此类型(T)继承的一些对象。
public abstract class Vehicle<P> {
List<? extends P> passengers = new ArrayList<>();
public <T extends P> void addPassenger(T pass){
passengers.add(pass);//error
}
}
但我在标记的行上收到错误:
类型List中的方法add(capture#1-of?extends P)不适用于参数(P)
我该如何正确地做到这一点?
答案 0 :(得分:2)
这可以这样做
public class Vehicle<P> {
List<P> passengers = new ArrayList<>();
public <T extends P> void addPassenger(T pass) {
passengers.add(pass);
}
}
现在添加我们可以添加乘客:
A a = new A("a"); // A superclass
B b = new B("b"); // B extends A
C c = new C("c"); // C extends B
D d = new D(); // not extending A
Vehicle<A> vehicle = new Vehicle<>();
vehicle.addPassenger(a);
vehicle.addPassenger(b);
vehicle.addPassenger(c); // passenger of type A,B and C can be added
vehicle.addPassenger(d); // !ERROR: passenger of type D can't be added.
答案 1 :(得分:1)
您要做的是将类型为“T”的传递添加到“扩展P的类型”的列表中。 因此,您必须将List的类型更新为'pass'或'pass'的类型与List的类型相同。
public abstract class Vehicle<T> {
List<T> passengers = new ArrayList<>();
public void addPassenger(T pass){
passengers.add(pass);
}
}