扩展通用摘要 Class:正确的边界
Extending Generic Abstract Class: Correct Bounding
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)
。从上面可以看出,SlotA
和SlotB
分别不需要SlotA(Manager<SlotA>)
和SlotB(Manager<SlotB>)
。
我知道抽象的构造函数Slot
不符合这个要求。我怎样才能编辑上面的代码来实现这个?
编辑:
我知道我可以将通用参数 T
添加到 Slot
并使构造函数 Slot<T>(Manager<T>)
但这意味着需要 SlotA<SlotA>
并且 SlotA<SlotB>
是可能的。还有比这更好的方法吗?
您必须使 Slot
class 通用,使用自引用类型参数:
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 如:
class SlotC extends Slot<SlotA> { }
你无法避免这种情况。这是一个这样的领域,Java 泛型无法在编译时应用限制。
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)
。从上面可以看出,SlotA
和SlotB
分别不需要SlotA(Manager<SlotA>)
和SlotB(Manager<SlotB>)
。
我知道抽象的构造函数Slot
不符合这个要求。我怎样才能编辑上面的代码来实现这个?
编辑:
我知道我可以将通用参数 T
添加到 Slot
并使构造函数 Slot<T>(Manager<T>)
但这意味着需要 SlotA<SlotA>
并且 SlotA<SlotB>
是可能的。还有比这更好的方法吗?
您必须使 Slot
class 通用,使用自引用类型参数:
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 如:
class SlotC extends Slot<SlotA> { }
你无法避免这种情况。这是一个这样的领域,Java 泛型无法在编译时应用限制。