给列表提供与包含它的类相同的类型

时间:2012-04-03 12:59:04

标签: java generics

我们假设我有一个可以扩展的A类。在A类中,我有一个列表List<A>。所以这个类将包含一个包含元素A的列表。现在如果我继承这个类B扩展A,我希望类B具有相同的成员List<B>,即相同的列表,但这个类型包含类型B的项目。这可能使用泛型?我可以看到类似A <T extends A>的内容,同时声明List<T>,但我不喜欢,因为有关类类型的信息已经存在。还有其他更好的解决方案吗示例如下:

public class A {
    List<A> list = new ArrayList<A>();
}

public class B extends A {
}

我希望列表在B类中具有泛型类型。

2 个答案:

答案 0 :(得分:2)

如果你想把行为放在超类中,那么你将不得不告诉超类子类是什么类型的类。这可以通过向超级添加泛型类型来完成。

public class A<E> {

  protected List<E> items;

  public A() {
    this.items = new ArrayList<E>();
  }
}

public class B extends A<B> {

  public static void main(String[] args) {
    B b = new B();

    b.items.add(b);
  }
}

答案 1 :(得分:0)

您可以在通用中使用extends关键字。 例如:

public class A {

    protected List<? extends A> list;
    public A() {
        list = new ArrayList<A>();
    }

    public <T extends A> List<T> getList() {
        return (List<T>) list;
    }
    public void setList(List<A> list) {
        this.list = list;
    }
}


public class B extends A {

    public B() {
        list = new ArrayList<B>();
    }

    public static void main(String[] args) {
        A a = new A();
        a.getList().add(new A());

        B b = new B();
        b.getList().add(new B());
    }
}