问题是,没有办法引用“这个非常类”的类型。这就是为什么你必须使用像abstract class Base<T extends Base<T>>
这样的结构。但正如很多评论中提到的,没有什么能阻止你定义Subclass1 extends <Subclass2>
。现在只有句法方式来保证T
是“这非常类”。
但是,您可以在运行时强制执行此保证。您可以使用类似TypeTools或其他方法来提取使用的泛型类型,并确保当前实例具有此类型。这可能会导致类似:
public abstract class Base<T extends Base<T>> {
protected Base() {
final Class<?> t = (Class<?>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
if (!t.isInstance(this)) {
throw new IllegalArgumentException();
}
}
public T getInstance() {
@SuppressWarnings("unchecked")
T thisIsT = (T) this;
return thisIsT;
}
}
这个类可以被实例化:
public class Extension1 extends Base<Extension1> {}
但是这一次没有:
public class Extension2 extends Base<Extension1> {}
的Base
构造保证this
是T
实例因此this
到T
的演员阵容是安全的。
如果我决定这样做,会中断:class ChildClass2 extends ParentClass'。 现在,我不完全清楚你想达到什么目的,或者你为什么想达到目标。如果你想相应地更新你的问题,我可能会提供一个答案。 –
@JoeC我有作品,但它要求我在父类中将“this”转换为T.它应该已经知道'this'是T的一个实例,所以我想知道是否有更优雅的解决方案那个想法不够聪明。无论是哪一个不需要我施放,或者是一个没有使用泛型就返回了这个子实例。 –
试试你对我建议的子类有什么,并让我知道它是否仍然有效。 –