是否可以将具有自身实例的类扩展为字段,以便子类具有子类的实例?

时间:2014-08-27 20:17:03

标签: java inheritance reflection recursive-datastructures

我知道您可以将LinkedList的实现分解为两类。在一个中,实际LinkedList是对某些链接节点中的第一个的引用,如此

public class LinkedList1<E>{

    class Node{
        E data;
        Node next;
    }

    Node head;

}

该版本可能更好,但另外,还有一个更“直接”的版本,这使得删除头部(头部意味着客户端的第一个元素)有点棘手,但仍然可以在LinkedList2的实例中使用:

public class LinkedList2<E>{

    E data;
    LinkedList2 next;

}

我很好奇是否有办法创建LinkedList2Child extends LinkedList2next字段的类型为LinkedList2Child,可能涉及反射?

编辑:这并不妨碍我完成任何事情,因为版本1可用 - 我只是对这个问题感到好奇,这是一个例子。

我知道你可以通过声明一个与父字段同名的字段来“隐藏”子类中的字段,但如果你想使用在该字段上运行的父方法,这将不起作用。

2 个答案:

答案 0 :(得分:1)

泛型:

public class LinkedList2<E, T extends LinkedList2>{

    E data;
    T next;

}

public class LinkedSubclass extends LinkedList2<LinkedSubclass> {

}

它通常受限于你可以用泛型做什么(例如在基类中构造新的“下一个”值需要接受子类型的类或工厂),但是会覆盖你想要的东西。 / p>

答案 1 :(得分:0)

这称为协方差(或共变量返回类型):

public static abstract class A
{
    public A get() { ... }
}

public static abstract class B extends A
{
    @Override
    public B get() { ... }
}

方法B#get()会覆盖A#get()。这与泛型正交(即在概念上是无关的)。