2011-11-14 101 views
1

我想使用從類的字段(使用反射)中獲得的類型實例化一個具有泛型的類。
注:我省略了希望易於閱讀的例外。實例化使用另一個類的字段類型的參數化類

public class AClass { 
    class BClass<T> { 
     T aMemba; 
    } 

    public void AMethod() { 
     Class c = Class.forName("com.bla.flipper"); 
     Field f = c.getField("flipIt"); 

     // Here is my difficulty, I want to instantiate BClass with the type of 
     // field 'f' but the compiler won't let me. 
     Class typeClass = f.getType(); 
     BClass<typeClass> = new BClass<typeClass>(); 
    } 
} 

是我想達到的合理性嗎?任何關於如何解決這個問題的想法?

謝謝!

BClass<typeClass> = new BClass<typeClass>(); 

typeClass是什麼,編譯器應該意識到:

+0

很多東西都是「合理」 ......大錘是合理的驅動杆到地面,但不作爲蒼蠅拍。所以如果你將一根杆子打入地面,那麼使用大錘是合理的。如果您想基於字段可能更改類型的類的字段類型來實例化類,那麼使用反射是合理的。 – Kiril

+1

如果您想在Java中使用泛型,您現在需要學習**的基本知識**:http://download.oracle.com/javase/tutorial/java/generics/erasure.html –

回答

1

可以捕獲類型類的類型的類型參數:

Field f = ...; 
Class<?> typeClass = f.getType(); 
withClassCapture(typeClass); 

private <T> void withClassCapture(Class<T> klazz) { 
    BClass<T> instance = new BClass<T>(); 
    // ... do your thing 
} 
+0

本,謝謝你的摘錄。我非常喜歡它,從來沒有想過我們可以這樣做。 – Gilbeg

2

無論你正在嘗試做的,因爲如果你看一下下面一行是不合理的。但在你的情況下,它只能在運行時通過反射來知道。

編譯器需要在BClass<T>中清除T,並用一個具體的類型替換它,在編譯時你的情況是未知的,因此在邏輯上它是無效的。

+0

謝謝Bhesh,the我遇到的最合理的解釋。 – Gilbeg

+0

@Gilbeg:沒問題。 –