Comparable接口的抽象继承形式

Boo*_*oom 2 java inheritance interface abstract comparable

我了解如何使用该Comparable<T>接口,但在这个特定的示例中,我想知道是否有一种方法要求从抽象类(实现该Comparable<T>接口)继承的类与其自身可比较。

让我重申一下,有一个实现 Comparable 接口的抽象类:

public abstract class MyAbstractClass implements Comparable<MyAbstractClass>
Run Code Online (Sandbox Code Playgroud)

以及一个继承自该抽象类的类:

public class MyClass extends MyAbstractClass
Run Code Online (Sandbox Code Playgroud)

通常,使用此设置,需要以下方法来满足可比较接口:

public int compareTo(MyAbstractClass otherAbstractObject)
Run Code Online (Sandbox Code Playgroud)

这需要我进行以下转换:

public int compareTo(MyAbstractClass otherAbstractObject)
{
    MyClass otherObject = (MyClass) otherAbstractObject;

    // Comparison...
    return result;
}
Run Code Online (Sandbox Code Playgroud)

鉴于尝试使用 的不同子级很容易导致此转换失败MyAbstractClass,我希望能够定义我的抽象类以接受以下方法:

public int compareTo(MyClass otherMyObject)
{
    // Comparison...
    return result;
}
Run Code Online (Sandbox Code Playgroud)

以及如何实现这一目标的想法?或者这根本不可能?

rge*_*man 5

您可以MyAbstractClass按如下方式定义使用泛型:

public abstract class MyAbstractClass<T extends MyAbstractClass<T>>
    implements Comparable<T> {
Run Code Online (Sandbox Code Playgroud)

然后你可以定义子类,例如

public class MyClass extends MyAbstractClass<MyClass>
Run Code Online (Sandbox Code Playgroud)

compareTo它允许您像这样定义方法:

public int compareTo(MyClass otherMyClass)
Run Code Online (Sandbox Code Playgroud)

但是,这并不能阻止任何人编写不符合该模式的子类:

public class SneakyClass extends MyAbstractClass<MyClass>
Run Code Online (Sandbox Code Playgroud)

这也将compareTo类似地定义该方法:

public int compareTo(MyClass otherMyClass)
Run Code Online (Sandbox Code Playgroud)

注意:没有什么可以强制类的泛型类型参数等于定义它的类;你能做的最好的事情就是强制抽象类的上限,至少强制它是某种MyAbstractClass.