2011-04-06 53 views
2

我想重寫一個方法,並用它的子類替換它所需的參數。抽象類A <T extends A>有沒有更好的解決方案?

對於返回類型,沒有問題,因爲它們不是方法簽名的一部分,可以用子類(稱爲「協變返回類型」)替換。對於論點來說,這是行不通的,因爲它們是簽名的一部分。

於是我想出瞭解決方案,使用相同類型的泛型參數:

public abstract class A<T extends A> { 

    public void loadValuesFrom(T source) { 
    ... 
    } 

} 

public class B extends A<B> { 

    public void loadValuesFrom(B source) { 
    super.loadValuesFrom(source); 
    ...  
    } 

} 

但聲明「公共抽象類A」看起來很奇怪我。還有其他方法可以實現嗎?任何「協變參數類型」? :-)

回答

1

如果它必須是參數類型,使用泛型可能是最好的選擇。我只是做了小幅調整,以避免在類聲明的原始類型:

public abstract class A<T extends A<T>> { 

然而,如果您擁有的對象初始化需要被剛創建的特殊情況下,你可能包括的方法創作,從而消除了將該對象作爲參數傳遞的需要:

public abstract class A { 
    public A clone() { 

    } 
} 

public class B extends A { 
    public B clone() { 
     // copy state 
    } 
} 
相關問題