从抽象父类中的方法返回具体子类的实例



>我想知道是否有更好的方法可以做到这一点。我想要的是让抽象类中的具体方法返回扩展抽象类的具体实例。

这是我现在正在做的事情:

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保证thisT的实例,因此将this强制转换为T是安全的。

最新更新