Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不可能实施可比<;T>;多次?_Java_Interface_Compare_Comparable_Multiple Interface Implem - Fatal编程技术网

Java 为什么不可能实施可比<;T>;多次?

Java 为什么不可能实施可比<;T>;多次?,java,interface,compare,comparable,multiple-interface-implem,Java,Interface,Compare,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(

看起来您通常在没有指定类型参数的情况下实现
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) {
        // ...
但是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>
Area.java:2:错误:接口重复
公共抽象类区域实现可比较、可比较{
^
Area.java:2:error:Comparable不能用不同的参数继承:and
  • 为泛型接口指定类型参数是否有任何缺点
  • 为什么Java不允许这种多重实现
  • 注意:我使用的是Java版本1.7.0_45

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

  • 这是因为。
    Comparable
    Comparable
    对于VM本质上是同一个类,并且在检查有效性后不久,对于编译器也是如此

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

    对于某些应用程序(在运行时区分泛型)您也可以尝试将它们子类化,例如,
    comparablerea extenses Comparable
    &
    ComparableVolume extenses Comparable
    ,但在这种特殊情况下,这将导致比IMO解决的问题更多的问题,因为您仍然会得到
    Comparable,不能用不同的参数继承
    错误-但至少您可以通过例如
    instanceof
    来区分这些接口

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

  • 这是因为。
    Comparable
    Comparable
    对于VM本质上是同一个类,并且在检查有效性后不久,对于编译器也是如此

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


    对于某些应用程序(在运行时区分泛型)您也可以尝试将它们子类化,例如,
    comparablerea extenses Comparable
    &
    ComparableVolume extenses Comparable
    ,但在这种特殊情况下,这将导致比IMO解决的问题更多的问题,因为您仍然会得到
    Comparable,不能用不同的参数继承
    错误-但至少您可以通过例如
    instanceof

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

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

    我同意。如果OP希望能够比较不同类型的多个项目,并且不共享一个共同的超类,那么最好只编写一个
    比较器
    ,它知道如何做到这一点。你的
    区域
    类实际上不应该(IMO)需要知道
    Volume
    类存在,也不知道如何比较它们自己。如果它们存在,那么你的
    Volume
    类不也需要实现这两个
    compariable
    吗?你可以看到,当你添加更多类型时,这会很快失控。@CraigOtis我完全同意;我将在我的答案中添加这一点作为注释。我同意。如果OP希望能够比较不同类型的多个项目,并且不共享一个公共超类,那么最好只编写一个
    比较器
    ,它知道如何做。你的
    区域
    类不应该真的(IMO)需要知道
    Volume
    类存在,也不知道如何比较它们自己。如果它们存在,那么你的
    Volume
    类不也需要实现这两个
    compariable
    吗?你可以看到,当你添加更多类型时,这会很快失控。@CraigOtis我完全同意;我将在我的答案中添加这一点作为注释。我认为更好的问题是,你为什么认为这会有好处?以及纽约会怎样。
    neuryork.compareTo(十一)
    苹果对苹果?:-)我认为更好的问题是,你为什么认为这会有好处?纽约会怎样。
    neuryork.compareTo(十一)
    苹果对苹果?:-)
    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>