Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 列表<;A>;参考列表<;A的子类>;_Java_List_Arraylist_Subclass_Superclass - Fatal编程技术网

Java 列表<;A>;参考列表<;A的子类>;

Java 列表<;A>;参考列表<;A的子类>;,java,list,arraylist,subclass,superclass,Java,List,Arraylist,Subclass,Superclass,如果我有一个类a,它包含一个类似类a的孩子的列表 public Class A { protected List<A> children = new ArrayList<A>(); ... } 公共A类 { 受保护的列表子项=新的ArrayList(); ... } 那么,在子类B中是否有可能拥有另一个类C的子类,并创建对类a中的子类列表的引用?类A具有其他类希望使用的方法,例如,将其子类发送到。然而,A类是一般类,B和C类更具体。因此,为了使代码的阅

如果我有一个类a,它包含一个类似类a的孩子的列表

public Class A
{
    protected List<A> children = new ArrayList<A>();
    ...
}
公共A类
{
受保护的列表子项=新的ArrayList();
...
}
那么,在子类B中是否有可能拥有另一个类C的子类,并创建对类a中的子类列表的引用?类A具有其他类希望使用的方法,例如,将其子类发送到。然而,A类是一般类,B和C类更具体。因此,为了使代码的阅读更容易,避免大量的类型转换,我希望超级类的列表引用子类的列表

因此,当我更新otherChildren时,children列表也将更新。我想做下面示例中的事情,但这不起作用,而且也不能强制转换(children=(List)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
{
     ...
}
公共类B扩展了
{
private List otherChildren=new ArrayList();
公共图书馆B()
{
儿童=其他儿童;
...
//修改其他子项将导致相同的结果
//儿童的改造
}
}
公共类C扩展了
{
...
}

通过使子对象引用其他子对象,您试图将
列表
视为
列表
,A可以合理地期望将A对象添加到它认为是as列表的对象中,但实际上应该是Cs的集合

这在概念上是无效的

如果这个赋值是有效的,那么在C中,您的其他孩子可能应该声明为
列表
。这就引出了一个问题:为什么不能直接使用子数组

编辑:


我认为您需要一个更复杂的a,可能使用带有“extend”参数的泛型。所以A没有As的列表,而是扩展为As的事物的列表

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

修复方法是使
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
}
公共A类{
受保护的列表子项=新的ArrayList();
// ...
}
公共类B扩展了A{
private List otherChildren=new ArrayList();
公共图书馆B(){
儿童=其他儿童;
}
// ...
}

公共C类扩展了A您所要做的就是将A类中儿童的声明更改为:

protected List<? extends A> children = new ArrayList<A>();

受保护的列表在Java中,即使只是使用ArrayList,它也会在您访问列表时自动从Object转换为T。但正如djna所说,如果没有显式强制转换,就不可能假设添加到列表中的A也是C。类B和C也有子类,但不是在类B和C中实现基本相同的函数,而是将参数类型更改为更具体的类型。我希望B类和C类使用A类中更通用的参数。好的,那么这个“extend”参数与Donal所指的相同?因为我收到了很多原始类型的警告,所以除了
public class A
之外还有什么别的原因吗?或者你是说阿伦提到的?因为向列表中添加一个实例似乎不起作用。这看起来有点有希望,因为我这样做时会收到大量原始类型的警告。这一切的意义就像我在之前的评论中写的那样“我在类a中有一组方法,它们迭代子类列表。类B和C也有子类,但不是在类B和C中实现基本相同的函数,而是将参数类型更改为更具体的类型。我希望B类和C类使用A类中更通用的一种。”因此,实际上可能有一种更好的方法way@Mattias:在A的定义中,您基本上在整个过程中将
A
更改为
A
(搜索和替换时间!)然后你让B和C通过那些
扩展A
语句来继承和专门化类型。在这一点上,你仍然得到的任何类型警告都应该是你做错了事情的真正问题。你的问题中没有足够的信息来提前指出这些问题。-)哦..我以为你只会更新“其他孩子”“。有关其他子项的任何更新都可以在子项中查看。。。不是他,是的,但是我在A类中也有一个“addMethod”,但是我读了一些泛型,发现如果你这样扩展是不可能的。不过这并不重要,它只是用于测试。我要试试这个,看看它是否能像预期的那样工作。还没有完全测试过,但到目前为止看起来还不错!谢谢你的回答!如果您想知道为什么这样做: