由于Java泛型的实现,因此不能有以下代码:
public class GenSet {
private E a[];
public GenSet() {
a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
}
}
如何在保持类型安全的同时实现此目的?
我在Java论坛上看到了这样的解决方案:
import java.lang.reflect.Array;
class Stack {
public Stack(Class clazz, int capacity) {
array = (T[])Array.newInstance(clazz, capacity);
}
private final T[] array;
}
但是我真的不知道发生了什么。
#1楼
一个简单但杂乱的解决方法是在主类中嵌套第二个“ holder”类,并使用它来保存数据。
public class Whatever{
private class Holder{
OtherThing thing;
}
public Holder[] arrayOfHolders = new Holder[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[] toArray(final List 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是类型参数, cls是Class , d1到d5是整数):
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);
#5楼
也许与这个问题无关,但是当我使用时出现“ generic array creation ”错误
Tuple[] tupleArray = new Tuple[10];
我发现@SuppressWarnings({"unchecked"})的以下作品(并为我工作@SuppressWarnings({"unchecked"}) :
Tuple[] tupleArray = new Tuple[10];