大家好日子。我的问题已在SO上多次讨论,但我无论如何都找不到答案。 所以,我需要在我的泛型类实例中存储泛型数组:
public class GenericArrayStorage<Item> implements Iterable<Item> {
private Item[] storage;
....
}
显然,我无法使用storage
与具体对象数组一起使用(我的IDE在Generic array creation
上显示错误new Item[]
)。经过一些研究,我写了这段代码:
@SuppressWarnings("unchecked")
public GenericArrayStorage() {
ParameterizedType genericSuperclass =
(ParameterizedType) getClass().getGenericSuperclass(); //error
Class clazz = (Class) genericSuperclass.getActualTypeArguments()[0];
storage = (Item[]) Array.newInstance(clazz, 10);
}
但这会导致以下错误:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
我说好了并写了这个:
@SuppressWarnings("unchecked")
public GenericArrayStorage() {
ParameterizedType pt =
(ParameterizedType) getClass().getGenericInterfaces()[0];
Class clazz = (Class) pt.getActualTypeArguments()[0]; //error
storage = (Item[]) Array.newInstance(clazz, 10);
}
这个导致另一个例外:java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
。悲伤却又是真的。
然后我将.getClass()
添加到pt.getActualTypeArguments()[0]
,我的构造函数现在不会抛出任何错误。但是,当我尝试在new GenericArrayStorage<Integer>()
之后使用此数组时,它会抛出以下内容:java.lang.ArrayStoreException: java.lang.Integer
。此行导致异常:storage[0] = new Integer(1);
那么,我怎么能使用通用数组呢?
答案 0 :(得分:0)
这种方法的唯一方法是在类型定义中捕获Item
的值。例如:
StringStorage extends GenericArrayStorage<String> {
}
然后,您的getClass().getGenericSuperclass()
应该按预期工作,在这种情况下返回String
。