组件类型
用这个:
array.getClass().getComponentType()
返回
Class表示数组的组件类型的信息。如果此类不表示数组类,则此方法返回null。
参考:
Class.getComponentType()
安全/不安全铸造
有没有一种方法可以从getComponentType()返回的Class强制转换为Class,而不会收到编译器警告?
采取这种方法:
public <T> void doSomething(final T[] array) throws Exception{ final Class<? extends Object[]> arrayClass = array.getClass(); final Class<?> componentType = arrayClass.getComponentType(); final T newInstance = (T) componentType.newInstance();}这是生成的字节码:
public void doSomething(java.lang.Object[] array) throws java.lang.Exception; 0 aload_1 [array] 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 [componentType] 10 aload_3 [componentType] 11 invokevirtual java.lang.Class.newInstance() : java.lang.Object [30] 14 astore 4 [newInstance] 16 return
如您所见,参数类型被擦除为Object
[],因此编译器无法知道T是什么。是的,编译器可以使用
array.getClass().getComponentType(),但这有时会失败,因为您可以执行以下操作:
Object[] arr = new String[] { "a", "b", "c" };Integer[] integerArray = (Integer[]) arr;doSomething(integerArray);(在这种情况下,
array.getClass().getComponentType()返回
String.class,但
T代表
Integer。是的,这是合法的,不会生成编译器警告。)



