一个新手问题(可能也是重复的),但有人可能会指出我对以下代码的错误:
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
方法。
如果有人指出我的不同,我会非常感激。
答案 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
然后尝试将data
与Comparable<T>
进行比较而不是T
,编译器提出异议,因为T
和Comparable<T>
不兼容。
注意:为了获得更大的灵活性,请使用Node<T extends Comparable<? super T>>
。这将允许您在同一比较中基于不同的子类混合和匹配节点(感谢JB Nizet,以获得一个很好的建议)。