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

Returning an instance of the concrete child class from a method in the abstract parent class

我想知道是否有更好的方法来做到这一点。我想要的是在抽象中有一个具体的方法 class return 扩展抽象的具体实例 class.

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

abstract class ParentClass<T extends ParentClass> extends RelativeLayout {
    ...
    public T aMethod(){
        return (T)this;
    }
}

class ChildClass1 extends ParentClass<ChildClass1>{
...
}

我认为我不必将它转换为 T,因为它始终是 T 的一个实例。

问题是无法引用 "this very class" 的类型。这就是为什么你必须使用像 abstract class Base<T extends Base<T>> 这样的结构。但是正如评论中提到的那样,没有什么可以禁止您定义 Subclass1 extends <Subclass2>。现在有句法方法可以保证 T 是 "this very class".

但是,您可以在运行时强制执行此保证。您可以使用 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;
    }
}

这个class可以实例化:

public class Extension1 extends Base<Extension1> {}

但这个不是:

public class Extension2 extends Base<Extension1> {}

Base 构造函数保证 thisT 的实例,因此 thisT 的转换是安全的。