java - List<A> 引用 List<subclass-of-A>

标签 java list arraylist subclass superclass

如果我有一个包含 A 类 child 列表的 A 类

public Class A
{
    protected List<A> children = new ArrayList<A>();
    ...
}

那么在子类 B 中是否有可能拥有另一个类 C 的子类并创建对类 A 中子类列表的引用? A 类具有其他类想要使用的方法,例如送他们的 child 去。但是,A类是一般类,B类和C类比较具体。因此,为了使代码更容易阅读并避免大量类型转换,我希望父类(super class)的列表引用子类的列表。

所以当我更新otherChildren时,children列表也会更新。我想像下面的示例那样做一些事情,但是那行不通吗,它也不能转换为 (children = (List< A >) otherChildren)

但是有没有办法做到这一点呢?我真的很想避免所有类型转换,否则我会得到。

public Class B extends A
{
    private List<C> otherChildren = new ArrayList<C>();

    public B()
    {
        children = otherChildren;
        ...
        // Modification of otherChildren will result in the same
        // modification in children
    }
}

public Class C extends A
{
     ...
}

最佳答案

你不能那样做,因为它们是不同的类型。您可以对 List<A> 的实例执行的操作之一是添加 A 的任意实例;你不能在 List<C> 上这样做因为它是一种更受限制的类型。

解决方法是使 A接受一个类型参数:

public class A <T extends A> {
    protected List<T> children = new ArrayList<T>();
    // ...
}

public class B extends A<C> {
    private List<C> otherChildren = new ArrayList<C>();
    public B() {
        children = otherChildren;
    }
    // ...
}

public class C extends A<? extends A> {
    // Or some such
}

当然,到时候你也可以说不需要otherChildren根本。可以直接在children上操作在子类中,它仍然可以在没有显式转换的情况下工作。

关于java - List<A> 引用 List<subclass-of-A>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829817/

相关文章:

java - 在Hbase中存储列表数据?

java - 在 Java 中可以将列表添加到集合中,但在 Python 中则不行?

java - 使用动态字符串引用 arraylist

java - 正则表达式语句(replaceAll)

java - 服务器排队的客户端数量以及客户端是否排队

python - 迭代时修改list和dictionary,为什么在dict上会失败?

c++ - C++中的列表继承

java - 如何将 DataSet<Row> 转换为 JSON 消息的 DataSet 以写入 Kafka?

java - 我需要在 JoinColumn 中写什么?

Java持久化: @ManyToMany Project to List<Projects>