我知道您可以将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()
。这与泛型是正交的(即在概念上不相关)。