似乎您通常在未指定type参数的情况下实现了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>



为通用接口指定type参数是否有任何缺点?
Java为什么不允许我执行这种多重实现?


注意:我正在使用Java版本1.7.0_45

最佳答案

不,指定通用名称不是缺点-实际上是一项功能。而且,除了众所周知的事实,您无法实例化泛型类型也不能创建泛型数组(这是实现的问题,而不是接口本身),我不记得在接口中使用泛型的任何缺点。
这是由于type erasure。对于VM,Comparable<Area>Comparable<Volume>本质上是同一类,并且在检查有效性之后不久,对于编译器也是如此。


如果要实现两个截然不同的可比较接口,只需对它们使用Comparator-与在类中继承相比,通常更容易维护组成。

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

关于java - 为什么不能多次实现Comparable <T>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27041930/

10-13 06:05