Andy已經描述瞭如何解決這個問題,我會盡力解釋原因。
S
不保證可指定爲MyAbs
,只能指定爲AbsClass
,每個實例將指定AbsClass
的子類。
考慮:
class MyOtherAbs extends AbsClass {}
MyClass myClass = new MyClass<MyOtherAbsClass>{};
這跟你有什麼衝突。
UPDATE:
根據您的意見,它看起來像你想實現以上。挑戰是如果MyOtherAbs
有一個帶參數的構造函數?或者被實現爲單例(即私有構造函數和靜態getInstance()
)。總之,沒有保證統一的方式可以構建這些。此外,由於類型擦除,在運行時,S的概念沒有了,所以你不能這樣做:
return new S();
你基本上有兩種選擇,一種是使用子類:
public interface AbsClassFactory<S extends AbsClass>{ //takes the place of MyClass
public S getInstance();
}
MyAbsFactory implements AbsClassFactory<MyAbs>{
public MyAbs getInstance(){
return new MyAbs(); //or however MyAbs is instantiated
}
}
另一種選擇是反思:
class MyClass {
public <S extends AbsClass> S getObj(Class<S> clazz) throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
}
注意,第二個假設有可用的無參數的構造函數,將拋出一個運行時異常,如果一個不是。
刪除'
',並更改單曲getObj()'要麼'MyAbs getObj( )'或'AbsClass getObj()'。就目前而言,沒有理由有一個類型變量。 –你能說出「做這個」時你想要什麼嗎? – Simon
我希望能夠初始化MyClass,然後調用getObj(),它將返回MyAbs對象。隨着安迪的回答,我將不得不將AbsClass投給MyAbs或MySecondAbs,這正是我試圖避免的 –
mwong56