有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java实例化并存储泛型数组

大家好。我的问题已经讨论过很多次了,但我还是找不到答案。 因此,我需要在我的泛型类实例中存储泛型数组:

public class GenericArrayStorage<Item> implements Iterable<Item> {

    private Item[] storage;
    ....
}

显然,我不能像处理具体对象数组那样处理storage(我的IDE在new Item[]上显示错误Generic array creation)。经过一些研究,我编写了以下代码:

@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);

那么,如何使用泛型数组呢


共 (1) 个答案

  1. # 1 楼答案

    唯一可行的方法是在类型定义中捕获Item的值。例:

    StringStorage extends GenericArrayStorage<String> {
    }
    

    那么getClass().getGenericSuperclass()应该按预期工作,在本例中返回String