为什么不能多次实现 Comparable<T> ?

Nik*_*s R 1 java compare interface comparable multiple-interface-implem

看起来您通常在java.lang.Comparable不指定类型参数的情况下实现接口。

public abstract class Area implements Comparable {
    @Override
    public int compareTo(Object other) {
        if (other instanceof Area)
            return new Double(getArea()).compareTo(other.getArea());
        return -1; // or something else
    }
    abstract public double getArea();
}
Run Code Online (Sandbox Code Playgroud)

由于我只想将苹果与苹果进行比较,因此我认为指定类型是有意义的。

public abstract class Area implements Comparable<Area> {
    @Override
    public int compareTo(Area other) {
        // ...
Run Code Online (Sandbox Code Playgroud)

如果我想介绍另一个类进行比较Area,我想我可以这样做:

public abstract class Area implements Comparable<Area>, Comparable<Volume> {
    @Override
    public int compareTo(Area other) {
        // ...
    }
    @Override
    public int compareTo(Volume other) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是java编译器告诉我:

Area.java:2: error: repeated interface
public abstract class Area implements Comparable<Area>, Comparable<Volume> {
                                                                   ^
Area.java:2: error: Comparable cannot be inherited with different arguments: <Area> and <Volume>
Run Code Online (Sandbox Code Playgroud)
  1. 为泛型接口指定类型参数有什么缺点吗?
  2. 为什么 Java 不允许我进行这种多重实现?

注意:我使用的是 Java 版本 1.7.0_45

小智 5

  1. 不,指定泛型并不是一个缺点——它实际上是一个特性。此外,我不记得在接口中使用泛型有什么缺点,除了众所周知的事实,您不能实例化泛型类型或创建泛型数组(但这更多是实现问题,而不是接口本身)。

  2. 这是由于类型擦除Comparable<Area>并且Comparable<Volume>本质上是与 VM 相同的类,并且在检查有效性后不久,对于编译器也是相同的。

如果您想实现两个不同的可比较接口,只需Comparator对它们使用s - 通常维护组合比类中的继承更容易。

对于某些应用程序(在运行时区分泛型),您也可以尝试对它们进行子类化,例如ComparableArea extends Comparable<Area>& ComparableVolume extends Comparable<Volume>,但是在这种特殊情况下,这会比解决 IMO 造成更多麻烦,因为您仍然会遇到Comparable cannot be inherited with different arguments错误 - 但至少您可以通过例如区分这些接口instanceof

  • 我同意。如果 OP 希望能够比较多个不同类型且不共享公共超类的项目,最好只编写一个知道如何做到这一点的 `Comparator`。你的`Area` 类不应该真的(IMO)需要知道`Volume` 类的存在,也不应该知道如何比较它们自己。如果*他们做到了*,那么您的`Volume` 类是否也需要实现两个`Comparable`?您可以看到随着您添加更多类型,这将如何迅速失控。 (2认同)