我正在尝试实现一个通用的DDLinked条目列表。我定义了以下类。
class DoublyLinkedList<T extends Comparable<T>>
class DLLNode<T extends Comparable<T>>
Entry<K extends Comparable<K>, V> implements Comparable<Entry<K, V>>
一旦我尝试创建一个类型为Entry的DoublyLinkedlist数组,如下所示:
DoublyLinkedList<DLLNode<Entry<K, V>>> array[] = (DoublyLinkedList<DLLNode<Entry<K, V>>>[]) new DoublyLinkedList[TABLE_SIZE];
我收到错误消息:
"The type DLLNode<Entry<K,V>> is not a valid substitute for the bounded
parameter <T extends Comparable<T>> of the type DoublyLinkedList<T>"
从我的另一个角度来看,我认为我可以制作一个通用类型的入门。
我的问题: 我是否采取了错误的方式来做这件事,还是我执行错了?
答案 0 :(得分:4)
您对DoublyLinkedList
的定义表明它必须采用与自身相当的类型。但是,您对DLLNode
的定义未实现Comparable<DLLNode<T>>
,这意味着DLLNode
与其自己的类型无法比较。因此,您无法在DLLNode
中使用DoublyLinkedList
作为参数类型。
答案 1 :(得分:0)
DLLNode需要实际实现Comparable,而不是将其用作通用类型。
你的语法也是如此。数组不能使用泛型。你能做的最好的就是:
DoublyLinkedList<?> array[] = new DoublyLinkedList[TABLE_SIZE];
答案 2 :(得分:0)
你需要这样做:
class DoublyLinkedList<T extends Comparable<? super T>> {}
class DLLNode<T extends Comparable<? super T>> implements Comparable<DLLNode<T>> {
public int compareTo(DLLNode<T> other) {
return 0;
}
}
abstract class Entry<K extends Comparable<? super K>, V> implements Comparable<Entry<K, V>> {}
class HashEntry<K extends Comparable<? super K>, V> extends Entry<K, V> {
public int compareTo(Entry<K, V> other) {
return 0;
}
}
然后你决定使用它:
DoublyLinkedList<DLLNode<HashEntry<K, V>>> array[] = new DoublyLinkedList[TABLE_SIZE];
这可行的原因是因为为<? super T>
类声明了DLLNode
。如果你只有<T>
,这将无效,因为HashEntry
无法比较。 Java中的泛型对于正确的做法来说有点痛苦。