public class Test3{
public static void main(String[] args)
{
String s="1";
String s1="2";
System.out.println(Compare.compare(s, s1));
}
}
class Compare {
public static Comparable compare ( Comparable o1, Comparable o2 ) {
if (o1.compareTo(o2) > 0)
return o1;
else
return o2;
}
}
上面的代码输出2,如果使用String.compareTo(String str)
则是正确的。但是,o1的类型实际上是原始类型Comparable
而不是Comparable<String>
,即使它是Comparable<String>
,也不能将可比较的o2作为参数传递。
那么o1.compareTo(o2)
实际上叫什么?以及它如何实际工作
答案 0 :(得分:1)
这是一个非常不明确的问题。您的第一个示例使用原始类型,因此Comparable#compareTo
期望某个类型T
(但因为您使用的是原始类型,这是Object
),它应该与之比较,以及原始类型Comparable
(在您的情况下为o2
)适合该情况(毕竟它是Object
)。
当您将班级更改为:
static class Compare {
public Comparable<String> compare(Comparable<String> left, Comparable<String> right) {
if (left.compareTo(right) > 0) {
return left;
} else {
return right;
}
}
}
这不起作用,因为compareTo
期望类型为T
(实际为String
),但您正在传递Comparable<String>
。一旦你看到jdk源中的Comparable
接口......
使用泛型IMO的正确实现将是:
static class Compare<T extends Comparable<? super T>> {
public T compare(T left, T right) {
if (left.compareTo(right) > 0) {
return left;
} else {
return right;
}
}
}