我长期以来一直使用 Java 中的一个习惯用法来在其(通常是抽象的)祖先类的方法中使用(非抽象)类的类信息(不幸的是,我找不到这种模式的名称):
public abstract class Abstract<T extends Abstract<T>> {
private final Class<T> subClass;
protected Abstract(Class<T> subClass) {
this.subClass = subClass;
}
protected T getSomethingElseWithSameType() {
....
}
}
其子类的一个例子:
public class NonGeneric extends Abstract<NonGeneric> {
public NonGeneric() {
super(NonGeneric.class);
}
}
但是,我在定义一个Abstract
具有自己的泛型参数的子类时遇到了麻烦:
public class Generic<T> extends Abstract<Generic<T>> {
public Generic() {
super(Generic.class);
}
}
这个例子是不可编译的;同样,无法使用 eg 指定泛型类型Generic<T>.class
,甚至无法使用通配符如Generic<?>
.
T
我还尝试将超类中泛型类型的声明替换为? extends T
,但这也不是可编译的。
有什么办法可以让这种模式与通用基类一起使用?