如何在Java中创建通用数组?

倖福魔咒の 提交于 2019-12-12 22:26:26

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

由于Java泛型的实现,因此不能有以下代码:

public class GenSet<E> {
    private E a[];

    public GenSet() {
        a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
    }
}

如何在保持类型安全的同时实现此目的?

我在Java论坛上看到了这样的解决方案:

import java.lang.reflect.Array;

class Stack<T> {
    public Stack(Class<T> clazz, int capacity) {
        array = (T[])Array.newInstance(clazz, capacity);
    }

    private final T[] array;
}

但是我真的不知道发生了什么。


#1楼

一个简单但杂乱的解决方法是在主类中嵌套第二个“ holder”类,并使用它来保存数据。

public class Whatever<Thing>{
    private class Holder<OtherThing>{
        OtherThing thing;
    }
    public Holder<Thing>[] arrayOfHolders = new Holder<Thing>[10]
}

#2楼

我编写了此代码段,以反射方式实例化为简单的自动化测试实用程序传递的类。

Object attributeValue = null;
try {
    if(clazz.isArray()){
        Class<?> arrayType = clazz.getComponentType();
        attributeValue = Array.newInstance(arrayType, 0);
    }
    else if(!clazz.isInterface()){
        attributeValue = BeanUtils.instantiateClass(clazz);
    }
} catch (Exception e) {
    logger.debug("Cannot instanciate \"{}\"", new Object[]{clazz});
}

请注意以下部分:

    if(clazz.isArray()){
        Class<?> arrayType = clazz.getComponentType();
        attributeValue = Array.newInstance(arrayType, 0);
    }

用于数组初始化,其中Array.newInstance(array的类,array的大小) 。 类可以是原始(int.class)和对象(Integer.class)。

BeanUtils是Spring的一部分。


#3楼

还要看这段代码:

public static <T> T[] toArray(final List<T> obj) {
    if (obj == null || obj.isEmpty()) {
        return null;
    }
    final T t = obj.get(0);
    final T[] res = (T[]) Array.newInstance(t.getClass(), obj.size());
    for (int i = 0; i < obj.size(); i++) {
        res[i] = obj.get(i);
    }
    return res;
}

它将任何类型的对象的列表转换为相同类型的数组。


#4楼

要扩展更多维度,只需将[]和维度参数添加到newInstance()T是类型参数, clsClass<T>d1d5是整数):

T[] array = (T[])Array.newInstance(cls, d1);
T[][] array = (T[][])Array.newInstance(cls, d1, d2);
T[][][] array = (T[][][])Array.newInstance(cls, d1, d2, d3);
T[][][][] array = (T[][][][])Array.newInstance(cls, d1, d2, d3, d4);
T[][][][][] array = (T[][][][][])Array.newInstance(cls, d1, d2, d3, d4, d5);

有关详细信息,请参见Array.newInstance()


#5楼

也许与这个问题无关,但是当我使用时出现“ generic array creation ”错误

Tuple<Long,String>[] tupleArray = new Tuple<Long,String>[10];

我发现@SuppressWarnings({"unchecked"})的以下作品(并为我工作@SuppressWarnings({"unchecked"})

 Tuple<Long, String>[] tupleArray = new Tuple[10];
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!