我一直在讀的問題的答案:當參數化類型通過層次結構時,在Java中創建泛型類型的實例?
Create instance of generic type in Java?
我已經實現了由拉爾斯·博爾建議的方法。我改編他的代碼如下:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class ParameterizedTypeEg<E> {
public Class<E> getTypeParameterClass() {
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
return (Class<E>) paramType.getActualTypeArguments()[0];
}
private static class StringHome extends ParameterizedTypeEg<String> {
private String _string;
StringHome (String string) {
_string = string;
}
}
public static void main(String[] args)
throws InstantiationException, IllegalAccessException {
String str = new StringHome("my string").getTypeParameterClass().newInstance();
String str2 = new ParameterizedTypeEg<String>().getTypeParameterClass().newInstance();
}
}
這種方法對str變量工作正常。然後str2創建與我看來是相同的類型(ParameterizedTypeEg < String>,它基本上是一個StringHome相同的東西)。但是,該方法對於str2不起作用,並且在嘗試投射(ParameterizedType)類型時拋出ClassCastException。
儘管對於str2,我已經用String參數化了ParameterizedTypeEg,getGenericSuperclass()返回的東西與str非常不同。此外,在方法str2中將'this'顯示爲ParameterizedTypeEg,而對於str,'this'是ParameterizedTypeEg $ StringHome。我想這是問題的根源。爲什麼Java沒有看到str2的泛型類型也被確定了?
當參數化類型通過多層次的層次結構時,我有似乎是同樣的問題?也就是說,B類包含A> < T>,並且我實例化了一個B.在A中,我不能通過使用上述方法確定A的參數化類型來創建一個String對象。該方法也會在遏制層次結構中產生異常。這使我產生了一個問題,因爲我希望能夠通過多級遏制和/或繼承來傳遞參數化類型,並且在所有情況下都有相同的方法生成泛型類型的實例。
感謝, 約翰
謝謝。這工作。但是在處理遏制問題時我提到了一個類似的問題,並且我發佈了一個與此類似的新問題。請參閱http://stackoverflow.com/questions/18559285/create-instance-of-generic-type-in-java-when-parameterized-type-is-contained – Jorocco