从抽象父 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
构造函数保证 this
是 T
的实例,因此 this
到 T
的转换是安全的。
我想知道是否有更好的方法来做到这一点。我想要的是在抽象中有一个具体的方法 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
构造函数保证 this
是 T
的实例,因此 this
到 T
的转换是安全的。