java: obteniendo la clase de los componentes de un array

Si tengo

public  doSomething(T[] array) { } 

¿Cómo puedo obtener T.class de la array ?

Si hago array.getClass() eso me da la T[].class .

Tipo de componente

Utilizar esta:

 array.getClass().getComponentType() 

Devuelve la Class representa el tipo de componente de una matriz. Si esta clase no representa una clase de matriz, este método devuelve null .

Referencia:

  • Class.getComponentType()

Fundición segura / insegura

¿Hay alguna manera de convertir a Class from Class devuelto por getComponentType () sin recibir una advertencia del comstackdor?

toma este método:

 public  void doSomething(final T[] array) throws Exception{ final Class arrayClass = array.getClass(); final Class componentType = arrayClass.getComponentType(); final T newInstance = (T) componentType.newInstance(); } 

Aquí está el código de byte generado:

 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 

Como puede ver, el tipo de parámetro se borra a Objeto [], por lo que el comstackdor no tiene forma de saber qué es T. Sí, el comstackdor podría usar array.getClass().getComponentType() , pero a veces fallaría miserablemente porque puedes hacer cosas como esta:

 Object[] arr = new String[] { "a", "b", "c" }; Integer[] integerArray = (Integer[]) arr; doSomething(integerArray); 

(En este caso, array.getClass().getComponentType() devuelve String.class , pero T significa Integer . Sí, esto es legal y no genera advertencias del comstackdor).