Java 从扩展类重写compareTo-what';发生什么事了?

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

我一直在尝试用以下方式覆盖compareTo: 这是原件:

@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
中的方法在其参数为a
Bravo
时必须正常工作,其效果必须是,
compareTo
为您提供了正确的总排序,无论将哪种类型的组合传递给它


如果您的意图是每个数组或集合只包含类为
Alpha
的对象,或者只包含类为
Bravo
的对象,那么您需要一些其他机制来确保所有内容都是同一个类,或者根本不使用子类(我认为@ATG就是这样做的).

在超级类上实现
Comparable
时,是否声明了泛型类型参数?为什么要使用
@Override
?我将Override放在那里,希望它能修复它。哈哈,我没有声明泛型类型参数。我会调查的。谢谢你的提示。
@Override
public int compareTo(Bravo b) { ... }
@Override
public int compareTo(Alpha a) { ... }