是否有任何可比对象无法与自身进行比较?

maa*_*nus 1 java comparable java-8

Comparable的契约中,没有任何东西强迫一个对象与它自己相比较。只是

强烈推荐,但不严格要求 (x.compareTo(y)==0) == (x.equals(y))

这意味着,它的建议对于x.compareTo(x)不扔。但是可以写一个

class X implements Comparable<Y> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

其中XY是两个不相关的类。我看不出它有什么好处,但在 Java 8 版本中HashMap甚至有相应的检查。

  • 是否允许X implements Comparable<Y>使用两个不相关的类来实现?
  • 有什么意义吗?

我想答案是肯定的和否定的,但这只是一个猜测

ass*_*ias 5

Comparable促进比较应该与相等一致的合同,即(a.compareTo(b) == 0) == a.equals(b)。但这并不强迫您这样做,任何奇怪的合同都可以执行。

所以你可以创建一个:

class DumbInteger implements Comparable<DumbInteger> {
    private final int i;
    public DumbInteger(int i) { this.i = i; }
    public int compareTo(DumbInteger di) { return 0; }
    public boolean equals(Object other) { /* checks */ return other.i == this.i; }
}
Run Code Online (Sandbox Code Playgroud)

你也可以创建一个:

class DumberInteger implements Comparable<String> {
    private final int i;
    public DumberInteger(int i) { this.i = i; }
    public int compareTo(String s) { return 0; }
    public boolean equals(Object other) { /* checks */ return other.i == this.i; }

    public static void main(String[] args) {
        System.out.println(new DumberInteger(0).compareTo("abc"));
    }
}
Run Code Online (Sandbox Code Playgroud)

但这样做可能没有意义。在任何情况下,这都不是 Java 8 特有的,因为 Comparable 接口自 Java 2 以来就存在并在 Java 5 中“通用”。

但这可能不是 Comparable 接口本身的缺陷,因为我认为 Java 中没有办法创建I<T>只能由T.