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

标签 java generics inheritance casting type-parameter

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

abstract boolean intersect(Event object);

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

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

最佳答案

如果将抽象类设为泛型,则可以允许子类将自身指定为参数类型:

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

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

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

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

关于java - 强制子类重写以自身为参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53148650/

相关文章:

java - 变量可能尚未初始化,不明白为什么

java - 为什么 Eclipse 不允许我导出 .jar?

java - 将 java 遗留代码转换为泛型——如何用类型替换对象?

java继承方法

java - Android - Java - MediaStore - 如何使用多个条件的选择

java - 使用泛型制作链表

delphi - 有没有一种简单的方法将 TDictionary 内容复制到另一个中?

C#、泛型列表和继承

c# - Collection<T> 不包含 ICollection 接口(interface)的所有属性

java - 重写接口(interface)函数时自动生成注释?