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 NodeHeapNode内部类中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. } } 

根据您的定义:

  1. HeapNodeNode的子类型,但implements Comparable>
  2. LinkedList需要一个类型参数,以便T implements Comparable
  3. LinkedList要求HeapNode implements Comparable
  4. 它没有(从上面的(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 T extends Comparable 。 这是好的,类型:HeapNode声明它可以与Node的任何Node或子类型进行比较。 当然,这意味着HeapNode需要覆盖compareTo ,但是你有点卡在那里,Node已经实现了Comparable。

编辑:正如评论指出的那样,这个答案是错误的,不值得修复,因为有正确的答案。 让它留给后人作为……的一课。 也许,我不像我想要的那样了解仿制药。