使用有界类型参数将对象添加到列表中

时间:2016-11-09 04:30:30

标签: java generics

我正在尝试创建泛型类,它将获得类型(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)

我该如何正确地做到这一点?

2 个答案:

答案 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);
  }
}