2013-10-30 20 views
5

Ho un metodo statico che restituirà un tipo personalizzato in base al tipo della classe,Come arrivare Classe <?> oggetto di un tipo generico

public class GenericMethod { 

    public static <T> T returnGeneric(Class<T> clazz) { 
     return null; 
    } 

} 

Ora, voglio passare una classe con un generico digitare ad esso,

CustomType<String> type = GenericMethod.returnGeneric(CustomType.class); 

l'unico problema è che la dichiarazione di cui sopra dà e avvertimento di conversione incontrollato.

ho provato la soluzione new CustomType<String>().getName() che non è anche risolvere il problema.

C'è un modo giusto per esso, o l'unica soluzione è quella di utilizzare @SuppressWarnings?

+1

Eventuali duplicati: http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime? – benzonico

risposta

1

Che si/dovrebbe piacerebbe provare è questo:

CustomType<String> type = GenericMethod.returnGeneric(CustomType<String>.class); 

Purtroppo, a causa della cancellazione di tipo non v'è alcuna differenza tra CustomType<A>.class e CustomType<B>.class, quindi questa sintassi non è supportato da Java.

Quindi il mio $ .02: quello che stai chiedendo non è possibile, in modo da appendere alle @SuppressWarnings ...

+0

Prova a compilarlo. –

+0

Perché, come ho detto: "quindi questa sintassi non è supportata da Java" – GerritCap

+0

La risposta è stata modificata, quindi è stato inserito il commento corretto. –

1

L'approccio migliore è quello di utilizzare un metodo di involucro e inserire tutti i tuoi avvertimenti in un unico posto.

E il termine "incontrollato" significa che il compilatore non dispone di informazioni sul tipo sufficiente per eseguire tutti i controlli di tipo necessari per garantire la sicurezza di tipo.

0

In teoria non si può fare a causa del tipo di cancellazione.

In pratica, però;) è possibile farlo perché l'informazione è in realtà nei file .class. Il modo più semplice che conosco è using Spring's GenericTypeResolver.

Dai un'occhiata.

+0

Non c'è differenza tra teoria e pratica. Stai fraintendendo quale tipo di cancellazione è. E i metadati di classe non sono rilevanti per questa domanda. – newacct

0

come hai detto @Simeon "In teoria non si può farlo a causa della cancellazione di tipo". Si può usare solo se si dispone sottoclassi di CustomType:

class GenericMethod { 

    public static <T> T returnGeneric(Class<T> clazz) { 
    try { 
     return clazz.newInstance(); 
    } catch (InstantiationException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    return null; 
    } 

    public static void main(String [] args){ 
    CustomeType<String> ct = returnGeneric(StringCustomeType.class); 
    System.out.println(ct); 
    } 
} 

class StringCustomeType extends CustomeType<String> { 
} 

class CustomeType<T> { 
} 
Problemi correlati