2

似乎您通常在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();
}

由于我只想比较苹果和苹果,我认为指定类型是有意义的。

public abstract class Area implements Comparable<Area> {
    @Override
    public int compareTo(Area other) {
        // ...

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

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

但是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>
  1. 为泛型接口指定类型参数是否有任何缺点?
  2. 为什么 Java 不允许我进行这种多重实现?

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

4

2 回答 2

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

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

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

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

于 2014-11-20T14:26:20.097 回答
-1

我认为这种方式java是说相关类可以是可比较的,但是使用人工比较器我们可以在不相关的类之间进行更多的比较。所以我们应该实现相关类(同一继承层次中的类)的通用接口。如果我们想添加一个人工实现,请添加一个可以通过的接口(因此有一对接口系列,如 Comparable 和 Comparator)。

于 2015-12-30T02:11:55.797 回答