我一直在阅读问题的答案:
我已经实施了 Lars Bohl 建议的方法。我修改了他的代码如下:
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,我已经使用字符串参数化了 ParameterizedTypeEg,但 getGenericSuperclass() 返回的结果与 str 非常不同。此外,在方法 str2 中,“this”显示为 ParameterizedTypeEg,而对于 str,“this”是 ParameterizedTypeEg$StringHome。我想这就是问题的根源。为什么 Java 看不到 str2 的泛型类型也已确定?
当参数化类型通过多个层次结构传递时,我遇到了同样的问题?也就是说,类 B<T> 包含 A<T>,我实例化了一个 B。在 A 中,我无法通过使用上述方法确定 A 的参数化类型来创建 String 对象。在包含层次结构的情况下,该方法也会产生异常。这给我带来了一个问题,因为我希望能够通过多个级别的包含和/或继承传递参数化类型,并在所有情况下使用相同的方法生成泛型类型的实例。
谢谢,约翰