java compareTo()for rawtype Comparable

时间:2018-04-11 07:01:11

标签: java-8 comparable generic-programming compareto

 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)实际上叫什么?以及它如何实际工作

1 个答案:

答案 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;
        }
    }
}