将Comparable <t>与Generic class </t>一起使用

时间:2014-11-22 10:27:00

标签: java generics

一个新手问题(可能也是重复的),但有人可能会指出我对以下代码的错误:

public class Node<T> implements Comparable<Node<T>> {

    protected final Comparable<T> data;
    protected final List<Node<T>> adj;

    public Node(Comparable<T> data) {
        this.data = data;
        adj = new ArrayList<Node<T>>();
    }

    @Override
    public int compareTo(Node<T> other) {
        return data.compareTo(other.data);
    }
}

compareTo方法显示编译错误: Comparable中的compareTo(T)不能应用于(java.lang.Comparable)。

或者我尝试使用public class Node<T extends Comparable<? super T>> implements Comparable<Node<T>>,但是如果我将此Node添加到,例如,ArrayList&gt;那么我无法使用ArrayList的contains方法。 如果有人指出我的不同,我会非常感激。

1 个答案:

答案 0 :(得分:5)

您需要告诉Java T扩展Comparable<T>,如下所示:

public static class Node<T extends Comparable<T>> implements Comparable<Node<T>> {

    protected final T data;
    protected final List<Node<T>> adj;

    public Node(T data) {
        this.data = data;
        adj = new ArrayList<Node<T>>();
    }

    @Override
    public int compareTo(Node<T> other) {
        return data.compareTo(other.data);
    }
}

Comparable<T>表示您可以将compareTo方法应用于T类型的对象。当您的版本声明

Comparable<T> data

然后尝试将dataComparable<T>进行比较而不是T,编译器提出异议,因为TComparable<T>不兼容。

注意:为了获得更大的灵活性,请使用Node<T extends Comparable<? super T>>。这将允许您在同一比较中基于不同的子类混合和匹配节点(感谢JB Nizet,以获得一个很好的建议)。