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
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>