java:获取数组组件的类

如果我有

公共<T>剂量测量(T[]阵列)
{
}

如何从array获取T.class

如果我做了array.getClass(),那我就得到了T[].class

组件类型

使用以下命令:

array.getClass().getComponentType()

返回表示
数组的组件类型。如果这
类不表示数组
类此方法返回null

参考资料:

  • Class.getComponentType()

安全/不安全铸造

有什么方法可以让我投到课堂上吗
从返回的类
getComponentType()而不获取
编译器警告

采取这种方法:

公共<T>void doSomething(最终T[]数组)引发异常{
最终类<?扩展对象[]>arrayClass=array.getClass();
最终类<?>componentType=arrayClass.getComponentType();
final T newInstance=(T)componentType.newInstance();
}

以下是生成的字节码:

公共void doSomething(java.lang.Object[]数组)抛出java.lang.Exception;
0 aload_1[阵列]
1 invokevirtual java.lang.Object.getClass():java.lang.Class[21]
4 astore_2[arrayClass]
5 aload_2[arrayClass]
6 invokevirtual java.lang.Class.getComponentType():java.lang.Class[25]
9 astore_3[组件类型]
10 aload_3[组件类型]
11 invokevirtual java.lang.Class.newInstance():java.lang.Object[30]
14 astore 4[新实例]
16返回

如您所见,参数类型被擦除为Object[],因此编译器无法知道T是什么。是的,编译器可以使用array.getClass().getComponentType(),但有时会失败,因为您可以执行以下操作:

对象[]arr=新字符串[]{“a”、“b”、“c”};
整数[]整数阵列=(整数[])阵列;
剂量测量法(积分法);

(在本例中,array.getClass().getComponentType()返回String.class,但T代表整数。是的,这是合法的,不会生成编译器警告。)

发表评论