Java通用类型和条目

时间:2015-04-15 20:43:37

标签: java generics

我正在尝试实现一个通用的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>"

从我的另一个角度来看,我认为我可以制作一个通用类型的入门。

我的问题: 我是否采取了错误的方式来做这件事,还是我执行错了?

3 个答案:

答案 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中的泛型对于正确的做法来说有点痛苦。