如果我有
公共<;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代表整数。是的,这是合法的,不会生成编译器警告。)