强制子类以自身作为参数覆盖方法

Nic*_*cea 13 java generics inheritance casting type-parameter

我有一个抽象的Event类,它有一个抽象的方法:

abstract boolean intersect(Event object);
Run Code Online (Sandbox Code Playgroud)

此方法应检查Event子类的两个实例是否基于特定子类的实例变量相交.我想强制Event的任何子类覆盖其实例变量的方法.设计这个的最佳方法是什么?这是我当前的实现,因为我正在更改参数类型,这是错误的.我也尝试过使用接口,但是遇到了类型参数的类似问题.

@Override
public boolean intersect(SubClassEvent e2) {

    boolean intersects = false;
    if(this.weekDay == e2.weekDay) {
        if (this.getStartTime() < e2.getStartTime() && this.getEndTime() > e2.getStartTime()) {
            intersects = true;
        }
        else if(this.getStartTime() >= e2.getStartTime() && this.getStartTime() < e2.getEndTime()){
            intersects = true;
        }
    }
    return intersects;
}
Run Code Online (Sandbox Code Playgroud)

ern*_*t_k 11

如果使抽象类具有通用性,则可以允许子类将自己指定为参数类型:

abstract class Event<T extends Event<T>> {
    abstract boolean intersect(T object);
}
Run Code Online (Sandbox Code Playgroud)

子类将能够声明自己的类型作为参数.除非您的代码库使用原始类型,否则这应该有效.

class SubClassEvent extends Event<SubClassEvent> {
     @Override
    boolean intersect(SubClassEvent object){return true;}
}
Run Code Online (Sandbox Code Playgroud)

此限制(或更确切地说是此例外)将是其他类型事件的原始类型和事件,这些事件可以允许其他参数类型.