【问题标题】:Add object to the list using bounded type parameter使用有界类型参数将对象添加到列表
【发布时间】:2016-11-09 21:42:53
【问题描述】:

我正在尝试创建通用类,该类将获取类型(T),并将包含列表和用于添加从该类型(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)

我怎样才能正确地做这些事情?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    可以这样实现

    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.
    

    【讨论】:

    • 这里的T 毫无意义。和public void addPassenger(P pass)一模一样
    【解决方案2】:

    您要做的是将“T”类型的通行证添加到“扩展P”类型的列表中。 因此,您必须将 List 的类型更新为与“pass”相同或将“pass”的类型更新为与 List 的类型相同。

    public abstract class Vehicle<T> {
      List<T> passengers = new ArrayList<>();
      public void addPassenger(T pass){
        passengers.add(pass);
      }
    }
    

    【讨论】:

    • 您能否编辑您的答案以添加解释为什么这解决了 OP 的问题?仅代码的答案往往不太有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2023-03-23
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多