有人知道解决这个问题的最佳方法吗?
我收到以下错误,我认为这意味着我需要一种不同的方法来比较节点的数据元素。
java: bad operand types for binary operator '<'
first type: V
second type: V
代码:
class Node<V> {
Node<V> left;
Node<V> right;
V data;
public Node(V d) {
left = null;
right = null;
data = d;
}
public void Insert(V d) {
if (data != null) {
if (d < data) {
if (left == null) {
left = Node(d);
} else {
left.Insert(d);
}
}
}
}
}
正如@Dan W 在评论中所建议的那样,类
V
中的泛型类型Node
应该定义一个上限,Comparable
以便将可能的类型限制为V
仅可比较(排序)的类型。在 Java 中,运算符
<
、>
、<=
、>=
只能用于数字基元类型,例如int
、float
、double
等。相反,要比较引用类型,它们的类需要实现接口Comparable
以定义其元素之间的自然顺序。大多数 Java 类(例如、
Integer
和许多其他类)已经实现了该接口,而对于您自己的类,您需要在方法中提供比较逻辑。Bealdung 的一篇很棒的文章也介绍了如何实现该接口。Float
Double
Comparable
compareTo
Comparable
Node
对于您来说,可以按以下方式重写类的通用版本:在上一个代码片段中,的类型参数
Comparable
用下限通配符 (Comparable<? super V>
) 而不是泛型参数V
(Comparable<V>
) 来表示,这样,当类的超类型实际上实现了接口时,不直接实现接口的类也可以被接受。例如,对于不直接实现接口但其超类型实际上实现了Comparable
接口的类,情况就是如此。与此类似,实例也可以被接受和对照。LocalDate
Comparable
ChronoLocalDate
LocalDate
特别感谢@Holger 在评论中指出这一点。
您收到此错误是因为编译器不知道是否
V
是支持与 进行比较的类型<
。您可以使用compareTo()
方法来比较泛型类型元素。查看此处了解更多信息。例子: