是否可以扩展一个具有自身实例的类作为字段,从而使子类具有子类的实例



我知道您可以将LinkedList的实现分为两类。其中,实际的LinkedList引用了一些链接节点中的第一个,比如这个

public class LinkedList1<E>{
    class Node{
        E data;
        Node next;
    }
    Node head;
}

这个版本可能更好,但另一种选择是,有一个更"直接"的版本,这使得删除head(head意味着客户端视角中的第一个元素)之类的事情有点棘手,但在LinkedList2:的实例中仍然是可能的

public class LinkedList2<E>{
    E data;
    LinkedList2 next;
}

我很好奇是否有任何方法可以创建LinkedList2Child extends LinkedList2,使next字段的类型为LinkedList2Child,可能涉及反射?

编辑:这并没有阻止我完成任何事情,因为版本1是可用的——我只是对这个问题很好奇,这就是一个例子。

我知道你可以通过声明一个与父字段同名的字段来"隐藏"子类中的字段,但如果你想使用对该字段进行操作的父方法,这是行不通的。

泛型:

public class LinkedList2<E, T extends LinkedList2>{
    E data;
    T next;
}
public class LinkedSubclass extends LinkedList2<LinkedSubclass> {
}

它受泛型的常规限制(例如,在基类中构造新的"下一个"值需要接受子类型的类或工厂),但会涵盖您想要的内容。

这被称为协变(或协变返回类型):

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

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

相关内容

  • 没有找到相关文章

最新更新