我知道您可以将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 LinkedList2
,next
字段的类型为LinkedList2Child
,可能涉及反射?
编辑:这并不妨碍我完成任何事情,因为版本1可用 - 我只是对这个问题感到好奇,这是一个例子。
我知道你可以通过声明一个与父字段同名的字段来“隐藏”子类中的字段,但如果你想使用在该字段上运行的父方法,这将不起作用。
答案 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()
。这与泛型正交(即在概念上是无关的)。