Заставить подкласс переопределить метод, указав его в качестве параметра

У меня есть абстрактный класс Event, который имеет абстрактный метод:

abstract boolean intersect(Event object);

Этот метод должен проверять, пересекаются ли два экземпляра подкласса 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;
}

Ответ 1

Если вы сделаете абстрактный класс универсальным, вы можете позволить подклассам указывать себя как тип параметра:

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

Подклассы смогут объявить свой собственный тип в качестве параметра. Если ваша кодовая база не использует необработанные типы, это должно работать.

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

Ограничение этого (или, скорее, исключения из этого) будут необработанными типами и событиями других типов событий, которые могут разрешать другие типы параметров.

Ответ 2

Это невозможно сделать в Java. Предположим, у вас есть подкласс SubClassEvent который реализует метод boolean intersect(SubClassEvent e2). Затем, если у него есть дополнительный подкласс SubSubClassEvent extends SubClassEvent, он унаследует метод boolean intersect(SubClassEvent e2) от SubClassEvent, основываясь на том, как наследование работает в Java.

SubSubClassEvent не должен переопределять метод, поскольку метод является неабстрактным в своем суперклассе SubSubClass. Но даже если SubSubClassEvent хотел переопределить метод, он должен переопределить его с помощью boolean intersect(SubClassEvent) сигнатуры boolean intersect(SubClassEvent). Если бы он реализовал метод с boolean intersect(SubSubClassEvent) сигнатуры boolean intersect(SubSubClassEvent), он не будет рассматриваться как переопределение метода boolean intersect(SubClassEvent) из своего суперкласса в соответствии с правилами переопределения метода Java.

Следовательно, SubSubClassEvent является подклассом Event, метод intersect которого не принимает свой собственный тип в качестве типа параметра, что нарушает ваше условие.