强制子类重写以自身为参数的方法

Force subclass to override method with itself as parameter

我有一个抽象事件 class,它有一个抽象方法:

abstract boolean intersect(Event object);

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

@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;
}

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

abstract class Event<T extends Event<T>> {
    abstract boolean intersect(T object);
}

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

class SubClassEvent extends Event<SubClassEvent> {
     @Override
    boolean intersect(SubClassEvent object){return true;}
}

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

这在 Java 中是不可能的。假设您的子类 SubClassEvent 实现了方法 boolean intersect(SubClassEvent e2)。然后,如果它有一个进一步的子类 SubSubClassEvent extends SubClassEvent,它将根据 Java.

中的继承方式从 SubClassEvent 继承方法 boolean intersect(SubClassEvent e2)

SubSubClassEvent 不必覆盖该方法,因为该方法在其超类 SubSubClass 中是非抽象的。但是即使 SubSubClassEvent 想要覆盖该方法,它也必须使用签名 boolean intersect(SubClassEvent) 覆盖它。如果它实现了一个带有签名 boolean intersect(SubSubClassEvent) 的方法,根据 Java 方法覆盖规则,它不会被认为是其超类中方法 boolean intersect(SubClassEvent) 的覆盖。

因此,SubSubClassEventEvent的子类,其intersect方法没有将自己的类型作为参数类型,违反了你的条件。