我有這2類獲取參數化類的實例在Java中
abstract class A
{
//some abstract methods and variables
}
class B<E extends A>
{
}
現在B的方法,我想獲得E的虛擬實例如何做到這一點? 這是正常 -
E temp = (E)(new Object());
我有過的類定義的控制,因此,他們很靈活。
我有這2類獲取參數化類的實例在Java中
abstract class A
{
//some abstract methods and variables
}
class B<E extends A>
{
}
現在B的方法,我想獲得E的虛擬實例如何做到這一點? 這是正常 -
E temp = (E)(new Object());
我有過的類定義的控制,因此,他們很靈活。
您需要將工廠對象(或實例)傳遞給B
的構造函數。沒有辦法指定泛型類型參數具有特定的構造函數,並且靜態類型在運行時不可用。
(你可以假冒一位傑出的價值與E temp = (E)new A() { };
,但是這是非常狡猾的一些集合代碼確實只與數組類似的東西。)
你有2個解決方案:
E
有一個沒有參數的構造函數,你可以使用反射來構建一個。abstract E buildE();
對於第一解決方案,你將不得不通過以班級爲你的構造函數的參數:
class B<E extends A>{
public B(Class<E> clazz){
//Create instance of E:
E e=clazz.newInstance();
}
}
對於第二解決方案,這意味着B類具有構建對象的抽象方法(或多或少相當於通過工廠):
public class B<E extends A>{
public abstract E buildE();
private void foo(){
E e = buildE();
//Do generic stuff with E
}
}
這樣,如果你創建一個子類B的,你需要實現這個方法
public class B1 extends B<Bar>{
//You are required to implement this method as it is abstract.
public Bar buildE(){
..
}
private void anyMethod(){
//call B.foo() which will use B1.buildE() to build a Bar
super.foo();
}
}
恕我直言,第二個解決方案是更乾淨。
您可以使用中的反射得到Class<E>
,然後獲得所需的構造,並呼籲newInstance
(Class<E>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]
-1這個假設'this'是擴展'B'的類的一個實例,並用一個具體的類型來解析它的類型參數。 'C類延伸B
@Paul Bellora提問者問「在B的方法中,我想得到一個E的虛擬實例」,所以這個'當然是一個具體的類 – Alan
請重新閱讀我的評論來理解它。嘗試使用'new B ' - 它會在'(ParameterizedType)this.getClass()。getGenericSuperclass()'上失敗。確保在使用它們之前瞭解模式。 –
能否請您對您的第二個建議的解決方案詳細點嗎? – ksb
我編輯了答案。 –