java怎么创建type_如何在Java中创建一个类型安全的通用阵列? (How to create a type safe generic array in java?)...

It's not type safe because of the primitive Class objects. For example I can create a new Stack in the following manner:

new Stack(boolean.class, 10);

Which is OK with the compiler but throws an exception because boolean.class is a Class and boolean[] cannot be cast to Boolean[].

The alternative you show commented out:

array = (T[])new Object[size];

Is actually somewhat type safe but for a different reason: it is due to erasure. You cannot, for example, cast a new Object[size] to a Number[], but the cast never happens on the array. It happens some time later, like when you return an element of the array from a method (in which case the element is casted). If you tried to do something like return the array to outside the object it will throw an exception.

Usually the solution is not to generically type the array. Instead, do something like this:

class Stack {

Object[] array = new Object[10];

int top;

void push(E elem) {

if(top == array.length)

array = Arrays.copyOf(array, array.length * 2);

array[top++] = elem;

}

E pop() {

@SuppressWarnings("unchecked")

E elem = (E)array[--top]; // type safe cast

array[top] = null;

return elem;

}

}

The above cast is type safe because you can only push an E in to the array. Both the JDK Stack (which extends Vector) and ArrayList work this way.

If you want to use newInstance, you would have to reject primitives as there is no way to represent them generically:

Stack(Class tClass, int size) {

if(tClass.isPrimitive())

throw new IllegalArgumentException();

// ...

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值