2016-11-29 71 views
0

我想知道是否有更好的方法来做到这一点。我想要的是在抽象类中有一个具体方法返回扩展抽象类的具体实例。从抽象父类中的方法返回具体子类的实例

这里是我现在在做什么:

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

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

我不认为我应该有,因为这总是投这T是T.

的一个实例
+4

如果我决定这样做,会中断:class ChildClass2 extends ParentClass '。 现在,我不完全清楚你想达到什么目的,或者你为什么想达到目标。如果你想相应地更新你的问题,我可能会提供一个答案。 –

+0

@JoeC我有作品,但它要求我在父类中将“this”转换为T.它应该已经知道'this'是T的一个实例,所以我想知道是否有更优雅的解决方案那个想法不够聪明。无论是哪一个不需要我施放,或者是一个没有使用泛型就返回了这个子实例。 –

+0

试试你对我建议的子类有什么,并让我知道它是否仍然有效。 –

回答

0

问题是,没有办法引用“这个非常类”的类型。这就是为什么你必须使用像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实例因此thisT的演员阵容是安全的。

相关问题