我遇到了以下通用类的定义:
public class binarysearchnode<T extends Comparable<T>> implements Comparable<binarysearchnode<T>>{
.............
}
请帮助解释为什么在实现类似的界面时,类会将自己指定为Type参数以进行比较? 它与以下内容有何不同:
public class binarysearchnode<T extends Comparable<T>> implements Comparable<? super (or extends)T>{
.............
}
答案 0 :(得分:6)
这使得可以将binarysearchnode
彼此进行比较。如果它实现了Comparable<T>
,那么这意味着可以将节点与节点的值进行比较,这将是奇数。
在课堂上你可能会发现这样的事情:
T value;
public int compareTo(binarysearchnode<T> other) {
return value.compareTo(other.value);
}
为了能够像这样实现compareTo()
,值类(T
)需要与其类的其他对象相比 - 因此在<T extends Comparable<T>>
中声明课程定义。
答案 1 :(得分:2)
这是因为班级作者想要写的是:
b1.compareTo(b2)
其中b1
和b2
是binarysearchnode
个实例。开发人员还向T
添加约束,以便T
扩展Comparable<T>
。可能是因为Comparable
binarysearchnode
的实施可能只依赖于T
个Comparable
个实例。
更一般地说,虽然类C1
可以实现Comparable<C2>
,但最终这样做是没有意义的:这并不意味着C2
的实例可以与C1
的实例相当。由于类型擦除,例如,类C1
无法实现 Comparable<C1>
和Comparable<C2>
。
此外,如果binarysearchnode<T>
直接实施Comparable<T>
,您至少会遇到两个问题:
binarysearchnode<T>
与另一个进行比较; binarysearchnote<T>
实例b
和T
实例t
,您可以写b.compareTo(t)
但不能t.compareTo(b)
(从那以后) T
没有,也无法实施Comparable<binarysearchnode<T>>
),这违反了Comparable
合同。答案 2 :(得分:2)
假设你有一个超类A
和一个子类B
。想象一下,超类实现Comparable<A>
,然后B
也将通过继承实现Comparable<A>
。
您的binarysearchnode类声明为:
public class binarysearchnode<T extends Comparable<T>>
将无法将B
作为T
的类型参数(B
未实现Comparable<B>
)
但定义如下:
public class binarysearchnode<T extends Comparable<? super T>>
它可以将B
作为T
的类型参数,因为B
实现了Comparable<A>
的{{1}}。