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)
以及如何实现这一目标的想法?或者这根本不可能?
您可以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
.