【问题标题】:java compareTo() for rawtype Comparable [duplicate]java compareTo() for rawtype Comparable [重复]
【发布时间】:2018-04-11 07:01:10
【问题描述】:
 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>,Comparable o2也不能作为参数传递。

那么,o1.compareTo(o2) 实际调用的是什么?以及它是如何工作的

【问题讨论】:

  • 您能解释一下,“但是 o1 的类型实际上是 Comparable 而不是 Comparable,即使它是 Comparable,Comparable o2 也不能作为参数传递。”是什么意思? Comparable 是一个通用接口。如果没有给出,Java 会将它们作为 Object 处理并使用它的 compareTo() 实现。
  • 我的意思是原始类型 Comparable 不是 Comparable ,即使它是 Comparable 。抱歉,我不知道我们不能在 stackoverflow 中简单地写 符号。
  • @Arman 在这种情况下不是,String#compareTo 将被使用

标签: java-8 comparable generic-programming compareto


【解决方案1】:

这是一个非常不清楚的问题。您的第一个示例使用原始类型,因此 Comparable#compareTo 需要与 T 的特定类型(但因为您使用的是原始类型,这是一个 Object),它应该与之比较,以及一个原始 Comparable (@987654326 @ 在你的情况下)适合这种情况(毕竟它是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&lt;String&gt;。这实际上是非常容易理解的,一旦您查看 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;
        }
    }
}

【讨论】:

  • 你的意思是原始类型会像 Comparable 这样工作吗?
  • 我没有真正得到的是 String 类只有 compareTo(String) 方法,而 Comparable 会有 compareTo(Object) 的抽象方法;它们之间不会有任何动态绑定。那么,在没有实现的情况下如何调用 compareTo(Object) 呢?
  • @최원우 它们不一样,擦除后你会得到类似interface Comparable { int compare(Object o) }的东西,它不会是Comparable&lt;Object&gt;....
  • @최원우 你想知道的东西叫做bridge method
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
相关资源
最近更新 更多