Java:组合generics,内部类和“实现”的问题
我遇到了generics, implements
和内部类的问题。 我正在创建一个包含内部类的LinkedBinaryHeap
类。 这个内部类是通用的HeapNode
,它扩展了我创建的通用Node
类; 它只是为键/优先级添加变量和方法。
在LinkedBinaryHeap
我创建了一个通用的LinkedList
来存储HeapNode
。 我假设存储的通用数据扩展了Comparable
类。
这是什么存储什么的布局:
BinaryHeap->LinkedList(Nodes)->HeapNode(extends Node)->DATA,KEY
我的问题是在声明LinkedList
:
LinkedList heap;
eclipse强调HeapNode
并给我错误:
绑定不匹配:LinkedBinaryHeap.HeapNode类型不是 有效替代有界参数> LinkedList类型
我认为错误告诉我HeapNode
必须实现Comparable
,但是我的Node
类实现了Comparable
,所以这是照顾的,对吗?
我尝试了各种不同的东西,但似乎没有任何效果,下面的代码是我最接近的。 请注意,我已经尝试将implements Comparable Node
从HeapNode
内部类中HeapNode
,并且它什么都没有改变。
码:
LinkedBinaryHeap.java:
public class LinkedBinaryHeap<E extends Comparable> { private LinkedList heap; public LinkedBinaryHeap(){ heap = new LinkedList(); } /* INNER CLASS DECLARATION. */ private class HeapNode extends Node implements Comparable<Node>{ int key; public HeapNode(int key, E data){ super(data); this.key = key; } public int getKey(){ return key; } public void setKey(int key){ this.key = key; } } }
Node.java:
public class Node<T extends Comparable> implements Comparable<Node>{ protected T data; protected Node next; protected Node previous; public Node(T data){ next = null; previous = null; this.data = data; } /* Some other methods left out here. */ public int compareTo(Node node) { return data.compareTo(node.getData()); } }
LinkedList.java:
public class LinkedList<T extends Comparable> implements Comparable<LinkedList>{ private Node head; private Node tail; private int size; public LinkedList(){ head = null; tail = null; size = 0; } /* Other methods left out. */ public int compareTo(LinkedList list){ // does stuff. } }
根据您的定义:
-
HeapNode
是Node
的子类型,但implements Comparable
> -
LinkedList
需要一个类型参数,以便T implements Comparable
- 即
LinkedList
要求HeapNode implements Comparable
- 它没有(从上面的(1),它
implements Comparable
)>
所以两者不兼容。
在LinkedList
,您需要将节点类型表示为类型参数,适当地限制,以及节点类型的组件类型参数,也适当地限制:
public class LinkedList, E extends Comparable> implements Comparable>{ private N head; private N tail; private int size; ...
现在你的LinkedBinaryHeap
需要调整它对LinkedList
的使用:
public class LinkedBinaryHeap> { private LinkedList heap; public LinkedBinaryHeap(){ heap = new LinkedList(); }
那应该编译。 它是否实现了将所有内容与其他所有内容进行比较的目标更难说!
LinkedList要求T实现Comparable。 HeapNode实现Comparable
。 HeapNode!= Node因此它不满足类型绑定。 将LinkedList的声明更改为T extends Comparable super T>
T extends Comparable super T>
。 这是好的,类型:HeapNode声明它可以与Node的任何Node或子类型进行比较。 当然,这意味着HeapNode需要覆盖compareTo
,但是你有点卡在那里,Node已经实现了Comparable。
编辑:正如评论指出的那样,这个答案是错误的,不值得修复,因为有正确的答案。 让它留给后人作为……的一课。 也许,我不像我想要的那样了解仿制药。