[英]How to create an interface with abstract methods that reference self-type in java
[英]Java field type for a value of a generically recursive self-type?
给定一个类层次结构,其中基类定义递归自我类型:
abstract class A<T extends A<T>> { }
我怎样才能声明另一个类(在T中不应该是通用的,因为这样的T可能在对象的生命周期内变化),并且一个字段可以包含A的任何子类?
以下不起作用:
public class B {
//fails to compile, because the capture of ? is not sufficiently narrow
private A<?> a;
public <T extends A<T>> setA(T a) {
this.a = a;
}
}
- 问题结束 -
我注意到一些StackOverflow成员倾向于接近某些难题,“你为什么要这样做呢?” 以下是我使用此模式的理由 - 您可以注意到Java标准库在其Enum类的定义中也使用递归自我类型: Enum<E extends Enum<E>>
。 同样可以将此问题称为“如何定义Enum<?>
类型的字段。
理由示例:
abstract class A<T extends A<T>> {
public abtract T self();
public B<T> bify(Bifyer bifyer) {
return bifyer.bify(self());
}
}
与子类:
class ASub1 extends A<ASub1> {
public ASub1 self() { return this; }
}
class ASub2 extends A<ASub2> {
public ASub2 self() { return this; }
}
绑定到并行类层次结构:
abstract class B<T extends A<T>> {
}
class BSub1<T extends A<T>> implements B<T> { }
class BSub2<T extends A<T>> implements B<T> { }
//and others
并且通过Bifyer接口的实现来管理B实例的生成:
interface Bifyer {
B<ASub1> bify(ASub1 asub1);
B<ASub2> bify(ASub2 asub2);
}
此接口的实现可以为B返回BSub1或BSub2。这实际上是访问者模式的应用,其中Bifyer是访问者,但与标准访问者不同,accept方法返回值而不是void。 这提供了一个模块化框架,可以指定不同的Bifyer实现来为Bify方法提供备用行为和返回类型 - 比如B的每个子类。
如果你绑定了通配符?
在A
下面,它应该工作:
public class B {
private A<? extends A> a;
public <T extends A<T>> void setA(T a) {
this.a = a;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.