2012-01-06 13 views
5

Il parametro è ArrayList <T> come posso ottenere className del TIl parametro è ArrayList <T> e come posso ottenere className del T

public static <T extends Object> void test(ArrayList<T> list){ 
     T temp; 
     Class classType=temp.getClass(); 
     System.out.println(classType.getName()); 
} 

Sarà riuscito a compilare che: egli temperatura variabile locale non può avere stato inizializzato.

Ma come posso ottenere il className della classe template.

risposta

6

Non è possibile ottenere il tipo generico. Ciò è dovuto al modo in cui i farmaci generici sono implementati in Java (usando la cancellazione dei tipi). Fondamentalmente, è possibile utilizzare solo generics per rilevare errori di tipo in fase di compilazione.

Il tuo codice non viene compilato, perché stai provando a chiamare getClass su una variabile locale che non è stata inizializzata.

Che cosa si potrebbe fare, invece è:

  • passaggio in un parametro Class<T> in aggiunta alla lista per raccontare il metodo sul tipo da utilizzare
  • o guardare il primo elemento della lista (se presente) e fidati del fatto che il suo tipo di runtime sia abbastanza rappresentativo (che potrebbe non essere)
4

Non è possibile, a causa della cancellazione del tipo nell'implementazione di generici Java. Quando è necessario conoscere la classe, il tipico trucco è quello di passare di classe come parametro separato chiamato "tipo di token", in questo modo:

public static <T extends Object> void test(ArrayList<T> list, Class<T> classType) { 
} 

Questo trucco è discusso con una certa ampiezza nel tutorial on Java generics (vedere il fondo della la pagina per un esempio).

1

Si può provare questo lavoro intorno:

public static <T extends Object> void test(ArrayList<T> list){ 
     if(null!=list && !list.isEmpty())   
       System.out.println(list.get(0).getClass().getName()); 
} 
+1

questo non funziona se (1) l'elenco è vuoto (anche se con carter fuori in modo che non va in crash, non riesce ancora a risolvere i l'attività), (2) il primo elemento è null, o (3) la classe del primo elemento è in realtà una sottoclasse di T, che ti darà la risposta sbagliata – newacct

Problemi correlati