java:获取数组组件的类

如果我有

public  doSomething(T[] array) { } 

如何从array获取T.class

如果我使用array.getClass()来获取T[].class

组件类型

用这个:

 array.getClass().getComponentType() 

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

参考:

  • Class.getComponentType()

安全/不安全的铸造

有没有一种方法可以从getComponentType()返回的类转换为Class而不会收到编译器警告?

采取这种方法:

 public  void doSomething(final T[] array) throws Exception{ final Class 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 。是的,这是合法的,不会生成编译器警告。)