>我想知道是否有更好的方法可以做到这一点。我想要的是让抽象类中的具体方法返回扩展抽象类的具体实例。
这是我现在正在做的事情:
abstract class ParentClass<T extends ParentClass> extends RelativeLayout {
...
public T aMethod(){
return (T)this;
}
}
和
class ChildClass1 extends ParentClass<ChildClass1>{
...
}
我认为我不应该把它投射到 T,因为这总是 T 的一个实例。
问题是没有办法引用"这个类"的类型。这就是为什么您必须使用诸如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
是安全的。