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

由于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];

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值