【问题标题】:Instantiate and store generic arrays实例化和存储通用数组
【发布时间】:2015-02-27 21:07:46
【问题描述】:

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

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&lt;Integer&gt;() 之后尝试使用此数组时,它会抛出以下内容:java.lang.ArrayStoreException: java.lang.Integer。此行导致异常:storage[0] = new Integer(1);

那么,我如何使用泛型数组?

【问题讨论】:

  • 在你的第一次尝试中,你会得到一个java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType,因为你的类实现了一个接口。超类是java.lang.Object,而不是ParametrizedType
  • @Tunaki 现在很清楚为什么我得到了这些例外。但这并没有回答这个问题:如何实现一个没有奇怪反射问题的通用数组存储?
  • this answer
  • 这个答案有什么问题:stackoverflow.com/questions/529085/…
  • 旁注:如果您使用List 代替,您将不会遇到此问题,代码更清晰易懂(storage = new ArrayList&lt;&gt;()

标签: java arrays generics reflection


【解决方案1】:

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

StringStorage extends GenericArrayStorage<String> {
}

那么您的getClass().getGenericSuperclass() 应该会按预期工作,在这种情况下返回String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多