我一直在读的问题的答案:当参数化类型通过层次结构时,在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