我想知道是否有更好的方法来做到这一点。我想要的是在抽象类中有一个具体的方法返回扩展抽象类的具体实例。
这就是我现在正在做的事情:
abstract class ParentClass<T extends ParentClass> extends RelativeLayout {
...
public T aMethod(){
return (T)this;
}
}
和
class ChildClass1 extends ParentClass<ChildClass1>{
...
}
我认为我不应该把它强制转换为T,因为这总是T的实例。
答案 0 :(得分:1)
问题是没有办法引用&#34;这个类#34;的类型。这就是你必须使用像abstract class Base<T extends Base<T>>
这样的结构的原因。但正如评论中提到的那样,没有什么能阻止你定义Subclass1 extends <Subclass2>
。现在只有语法方法来保证T
是#34;这个类#34;。
但是,您可以在运行时强制执行此保证。您可以使用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
的投射是安全的。