似乎您通常在未指定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/