Java泛型不识别类型?
我有一个类Java泛型不识别类型?,java,generics,data-structures,Java,Generics,Data Structures,我有一个类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 get
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; }
}
在我的DoublyLinkedList
类中,我得到一个错误,说无法解析方法setPrev()
,在许多地方我得到required:DoublyLinkedList-get:Object
在我决定统一Node的实现之前,该代码一直运行良好。您的设计问题似乎源于
Node
中的N
类型参数。为了简单起见,我们先删除可比的内容:
abstract class Node<N, T> {
第一个类型参数是String
,因此我们的prev
和next
字段都是字符串。这有意义吗?不,绝对不是。链中的下一个节点也必须是节点
您将发现该节点实际上只需要一个类型参数。prev
和next
字段的类型可以是节点
:
抽象类节点{
私有节点prev;
私有节点下一步;
私有T数据;
//…能手和二传手
}
setPrev
和setNext
都设置为this
,这似乎也很奇怪。我很容易看出这会导致程序进入无限循环。似乎期望有阳极.getNext()
和阳极.getPrev()
严格地返回类型为阳极的实例(而不是类型为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> {}
抽象类节点{}
类节点,此设计将导致以下问题:
class DNode<T extends Comparable<T>> extends ANode<T> {}
class ENode<T extends Comparable<T>> extends ANode<T> {}
类DNode扩展阳极{}
类ENode扩展阳极{}
在这些情况下,DNode/ENode.getNext()/getPrev()
将返回实例,因为父类已经设置了类型约束。哪些行导致了该错误?复制了您的代码。此处无错误消息required:DoublyLinkedList get:Object
提示您正在使用原始类型。尝试参数化基本类型不是一个好主意错误源于使用setPrev()和setNext()的驱动程序类方法应该有所不同,这取决于我使用的是双链接节点,还是fibonaccinode我以前使用过。问题是prev和next不一定是节点。它们属于FibonacciNode
或DoublyLinkedNode
@BenjaminKosten类型如果你的代码必须知道FibonacciNode和DoublyLinkedNode之间的区别,那么你的设计是错误的。嗯,谢谢,我没有这样想。您是否建议只使用节点类?您建议如何修复此设计缺陷?有多个节点有什么问题?我只希望我的节点类为属性数据、下一个和上一个设置getter和setter。然后,如何处理这些问题取决于阳极
和BNode
的实现。
abstract class Node<T> {
private Node<T> prev;
private Node<T> next;
private T data;
//... getters and setters
}
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> {}
class DNode<T extends Comparable<T>> extends ANode<T> {}
class ENode<T extends Comparable<T>> extends ANode<T> {}