我有一个类Node
作为DoublyLinkedNode
和FibonacciNode
的抽象类。
package com.benjamin;
abstract class Node<N, T extends Comparable<T>> {
private N prev;
private N next;
private T data;
public N getPrev() { return prev; }
public N getNext() { return next; }
public T getData() { return data; }
public void setPrev(N prev) { this.prev = prev; }
public void setNext(N next) { this.next = next; }
public void setData(T data) { this.data = data; }
}
DoublyLinkedNode
和FibonacciNode
扩展了此类,以为这两种实现提供通用方法。我的问题是,当我传入Java时,java似乎无法将
N
的类型识别为DoublyLinkedList
。package com.benjamin;
public class DoublyLinkedNode<T extends Comparable<T>> extends Node<DoublyLinkedNode<T>, T>{
DoublyLinkedNode() {
setPrev(this);
setNext(this);
setData(null);
}
DoublyLinkedNode(T data) {
setData(data);
}
@Override
public String toString() {
if(getData() != null) {
return "| " + getData().toString() + " |";
}
else {
return "| ; |";
}
}
}
在我的
DoublyLinkedList
类中,我收到一条错误消息,说unable to resolve method setPrev()
,在许多地方,我得到了required: DoublyLinkedList got: Object
在我决定统一Node的实现之前,这段代码运行良好。
最佳答案
似乎期望使ANode.getNext()
和ANode.getPrev()
严格返回类型为ANode
的实例(而不是类型为BNode
,CNode
等的实例)。如果是,则将执行以下操作:
abstract class Node<N extends Node<N, T>, T extends Comparable<T>> {}
class ANode<T extends Comparable<T>> extends Node<ANode<T>, T> {}
class BNode<T extends Comparable<T>> extends Node<BNode<T>, T> {}
class CNode<T extends Comparable<T>> extends Node<CNode<T>, T> {}
但是,如this comment中指出的那样,此设计将导致以下问题:
class DNode<T extends Comparable<T>> extends ANode<T> {}
class ENode<T extends Comparable<T>> extends ANode<T> {}
在这些情况下,
DNode/ENode.getNext()/getPrev()
将返回ANode
实例,因为父类已经设置了类型约束。关于java - Java泛型无法识别类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51982150/