【发布时间】:2013-10-19 05:01:17
【问题描述】:
我长期以来一直使用 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);
}
}
这个例子是不可编译的;同样,不可能使用例如指定泛型类型。 Generic<T>.class 甚至可以使用像 Generic<?> 这样的通配符。
我还尝试将超类中泛型类型T 的声明替换为? extends T,但这也无法编译。
有什么方法可以让这种模式与通用基类一起使用?
【问题讨论】:
-
I can't find the name of this pattern:听起来像它的Strategy pattern -
这不是一种模式,它是java中的一个习惯用法,可能是为了规避糟糕的泛型实现......而且不知道它是如何被调用的。
-
我认为您正在寻找curiously recurring template pattern - 即“自我类型”。 Java 不支持 self 类型,它 can only be approximated.
-
"我长期使用设计模式" Java 中没有这样的模式。你正在做的事情可以用
public abstract class Abstract<T> -
我已经在我的答案中重写了很多代码 - 现在有一个无演员表的解决方案可供您使用。
标签: java generics inheritance abstract-class