java - 扩展通用抽象类 : Correct Bounding

标签 java generics abstract

public class GenericTest {

    public static void main(String[] args) {
        Manager<SlotA> mA = new Manager<SlotA>();
    }

}

class Manager<SlotClass extends Slot> {

}

abstract class Slot {
    public Slot(Manager<? extends Slot> m) {

    }
}

class SlotA extends Slot {

    public SlotA(Manager<SlotB> m) { //a constructor with Manager<SlotA> is not required!
        super(m);
    }
}

class SlotB extends Slot {

    public SlotB(Manager<SlotA> m) { //a constructor with Manager<SlotB> is not required!
        super(m);
    }

}

以上是模拟我试图克服的问题的代码。我的目标是强制执行 Slot 的子类必须具有使用相同泛型类型的管理器的构造函数。也就是说,SlotC必须有一个构造函数 SlotC(Manager<SlotC> m) .如上所示,SlotASlotB不需要 SlotA(Manager<SlotA>)SlotB(Manager<SlotB>)分别。

我知道抽象的构造函数Slot不符合这个要求。我怎样才能编辑上面的代码来实现这一点?

编辑:

我知道我可以添加一个通用参数 TSlot并使构造函数Slot<T>(Manager<T>)但这意味着需要 SlotA<SlotA>SlotA<SlotB>是可能的。还有比这更好的方法吗?

最佳答案

您必须制作 Slot泛型类,使用自引用类型参数:

abstract class Slot<T extends Slot<T>> {
    public Slot(Manager<T> m) {

    }
}

class SlotA extends Slot<SlotA> {

    public SlotA(Manager<SlotA> m) { //a constructor with Manager<SlotA> is not required!
        super(m);
    }
}

class SlotB extends Slot<SlotB> {

    public SlotB(Manager<SlotB> m) { //a constructor with Manager<SlotB> is not required!
        super(m);
    }
}

现在您的 SlotA构造函数只能有一个 Manager<SlotA> .

但是,这并不限制某人创建如下类:

class SlotC extends Slot<SlotA> { }

而且您无法避免这种情况。这是一个这样的领域,Java 泛型无法在编译时应用限制。

关于java - 扩展通用抽象类 : Correct Bounding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682707/

相关文章:

c# - 当类型已知时,类型 'T' 不能用作泛型类型或方法错误中的类型参数

oop - 在 TypeScript 中扩展 React 组件

ios - 如何将方法的返回类型编写为符合协议(protocol)+ swift的类

java - 使用 jaxb 注释映射 XML 子子项

java - 我可以在 Google 电子表格中存储多少个单元格?

c# - 泛型警告 T 与其他类型的类型同名

java - 在具体的 JPA 类之间共享 Java 实现的最佳方法是什么?

C#:在不定义新类的情况下创建抽象类的实例

java - 在这种情况下使用 .wait() 和 .notifyAll 是不好的做法吗

java - 正则表达式不接受空格