2016-11-29 100 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的演員陣容是安全的。

相關問題