如何在java中创建一个类型安全的通用数组?

Giu*_*Pes 4 java arrays generics

我想在java中创建一个通用数组,保持Java通常提供的类型安全性.

我正在使用此代码:

class Stack<T> { 

private T[] array = null;
public Stack(Class<T> tClass, int size) {
   maximumSize = size;
   // type unsafe
   //array = (T[])new Object[maximumSize];

   this.array = (T[])java.lang.reflect.Array.newInstance(tClass,maximumSize);
}
Run Code Online (Sandbox Code Playgroud)

这个代码类型安全吗?如果是这样,为什么?为什么如果它是类型安全我需要演员?

Sot*_*lis 9

Array.newInstance(..)方法的返回类型为Object.因此,您无法直接将其分配给除此之外的任何内容Object.因此你需要一个演员.

该方法委托给一个native方法

创建具有指定组件类型和长度的新数组

因此它正在创建一个类型的数组T.

类型安全,假设array声明为

T[] array;
Run Code Online (Sandbox Code Playgroud)

,由Class<T>参数和使用相同类型变量的强制转换保证.

你应该添加

@SuppressWarnings("unchecked")
Run Code Online (Sandbox Code Playgroud)

在您的源代码中解释上述原因的评论.始终评论为什么正在压制警告的演员是安全的.

  • 请注意,这样做会引发基本类型的异常.例如,`int.class`是一个`Class <Integer>`因此将`int []`转换为`Integer []`.一般来说,没有办法表示基元.这就是它可能不安全的原因. (5认同)