Java 从扩展类重写compareTo-what';发生什么事了?
我一直在尝试用以下方式覆盖compareTo: 这是原件:Java 从扩展类重写compareTo-what';发生什么事了?,java,interface,extends,comparable,compareto,Java,Interface,Extends,Comparable,Compareto,我一直在尝试用以下方式覆盖compareTo: 这是原件: @Override public int compareTo(ProductPart6 s) { return this.getproductName().compareTo(s.getproductName()); } 这就是我试图用以下内容覆盖它的内容: 它抛出了一个错误 SubClass类型的方法compareTo(SubClass)必须重写或实现超类型方法 @Override public int compa
@Override
public int compareTo(ProductPart6 s)
{
return this.getproductName().compareTo(s.getproductName());
}
这就是我试图用以下内容覆盖它的内容:
它抛出了一个错误
SubClass类型的方法compareTo(SubClass)必须重写或实现超类型方法
@Override
public int compareTo(SubClass s)
{
return this.getTitle().compareTo(s.getTitle());
}
我认为这是非常错误的。我的ProductPart6没有getTitle(),这导致了它
@Override
public int compareTo(ProductPart6 s)
{
return this.getTitle().compareTo(s.getTitle());
}
抛出一个错误(getTitle()对于ProductPart6类型是未定义的)-如果我定义了它,那么重写它就没有意义了。
我做错了什么?我有扩展ProductPart6的子类,ProductPart6实现了Comparable-我想我可以在子类上实现它,但是没有。那是不可能的。当一个类实现了
Comparable
时,你必须指定对象的类型(T
),你的类的实例可以与之进行比较。compareTo
的所有子实现也必须接受相同的类型参数T
让我们考虑两个类:
public class Alpha implements Comparable<Alpha> {
@Override
public int compareTo(Alpha a) {
...
}
}
如果您试图在Bravo
中覆盖compareTo
,则必须提供类型为Alpha
的参数,因为Alpha
是类声明中满足T
的类型(其中包括实现可比的)。否则,它不会覆盖超类型方法,因此编译器会抱怨@override
注释,这就是您在这里看到的
在您的情况下,我认为您需要考虑<代码>产品部分6>代码>和<代码>子类< /代码>是否足够兼容,从而以这种方式使用。如果不是,请考虑使用单独的<代码>比较器< /COD>实例来代替或重构创建一个满足两种情况下的<>代码> t>代码>的通用类型。
扩展到@ ATG的答案:如果你有这个类:
public class Alpha implements Comparable<Alpha> {
@Override
public int compareTo(Alpha a) {
...
}
}
由于集合中可以同时包含Alpha
和Bravo
两种类型的对象,因此集合操作需要能够以任意顺序将一种类型的对象与另一种类型的对象进行比较。它可能会呼叫
A.compare(B);
其中A
是Alpha
,B
是Bravo
。这将调用您在Alpha
中编写的compareTo
方法。它也可以调用
B.compare(A);
其中A
是Alpha
,B
是Bravo
。这就是为什么申报是错误的
@Override
public int compareTo(Bravo b) { ... }
在Bravo
类中,因为这将阻止调用B.compare(A)
。您不仅需要这样声明:
@Override
public int compareTo(Alpha a) { ... }
当使用Bravo
和Alpha
调用它时,它也必须正常工作。此外,Alpha
中的方法在其参数为aBravo
时必须正常工作,其效果必须是,compareTo
为您提供了正确的总排序,无论将哪种类型的组合传递给它
如果您的意图是每个数组或集合只包含类为Alpha
的对象,或者只包含类为Bravo
的对象,那么您需要一些其他机制来确保所有内容都是同一个类,或者根本不使用子类(我认为@ATG就是这样做的).在超级类上实现Comparable
时,是否声明了泛型类型参数?为什么要使用@Override
?我将Override放在那里,希望它能修复它。哈哈,我没有声明泛型类型参数。我会调查的。谢谢你的提示。
@Override
public int compareTo(Bravo b) { ... }
@Override
public int compareTo(Alpha a) { ... }