Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型不识别类型?_Java_Generics_Data Structures - Fatal编程技术网

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> {}