2013-06-21 25 views
2

我有這2類獲取參數化類的實例在Java中

abstract class A 
{ 
//some abstract methods and variables 
} 

class B<E extends A> 
{ 
} 

現在B的方法,我想獲得E的虛擬實例如何做到這一點? 這是正常 -

E temp = (E)(new Object()); 

我有過的類定義的控制,因此,他們很靈活。

回答

3

您需要將工廠對象(或實例)傳遞給B的構造函數。沒有辦法指定泛型類型參數具有特定的構造函數,並且靜態類型在運行時不可用。

(你可以假冒一位傑出的價值與E temp = (E)new A() { };,但是這是非常狡猾的一些集合代碼確實只與數組類似的東西。)

3

你有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(); 
    } 

} 

恕我直言,第二個解決方案是更乾淨。

+0

能否請您對您的第二個建議的解決方案詳細點嗎? – ksb

+0

我編輯了答案。 –

-1

您可以使用中的反射得到Class<E>,然後獲得所需的構造,並呼籲newInstance

(Class<E>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0] 
+0

-1這個假設'this'是擴展'B'的類的一個實例,並用一個具體的類型來解析它的類型參數。 'C類延伸B '。 –

+0

@Paul Bellora提問者問「在B的方法中,我想得到一個E的虛擬實例」,所以這個'當然是一個具體的類 – Alan