2015-04-20 13 views
7

Ho un metodo in cui desidero accettare i tipi di classe che devono estendere una classe astratta. Qual è la differenza traJava Generics - limiti superiori nella firma del metodo

<T extends AbstractClass> void myMethod(Class<T> clazz);

e

void myMethod(Class<? extends AbstractClass> clazz);?

Non sarei in grado di fare direttamente riferimento al tipo all'interno del metodo nel secondo caso. C'è qualche differenza tra i tipi di classe che possono essere passati a questi due metodi?

+2

@prudhvi, il '' è un parametro di tipo (limitato), rendendo la dichiarazione generale quella di un metodo generico. È diverso dall'essere un metodo di una classe generica. –

+0

@JohnBollinger Ho pensato che dovrebbe essere myMethod (Classe clazz); o void myMethod (Classe clazz); Ho ragione? – Prudhvi

+1

* "Ho ragione?" * No, non lo sei. Il parametro type non sostituisce il tipo restituito. – Tom

risposta

5

No, non c'è alcuna differenza tra i tipi di argomento compatibili con le due firme di metodo presentate. Personalmente, userei la versione parametrizzata se avessi bisogno di fare riferimento al tipo esatto rappresentato dall'argomento, ma altrimenti userei la versione jolly.

2

Nel 1 ° quella che sarà anche in grado di restituire T (o qualsiasi tipo parametrico con T: Lista <T>, Set <T> e così via ...), senza bisogno di lanciare lo

<T extends AbstractClass> T myMethod(Class<T> clazz); 

e usarlo come:

molti luoghi
Subclass parameterInstance =... 
Subclass i1 = myMethod(parameterInstance.getClass()); 
1

Questa domanda è stato chiesto, in particolare here e here.

Entrambe le domande trattano principalmente con caratteri jolly e tipi generici illimitati, ma gli stessi principi si applicano qui. Raccomando anche di leggere uno dei link (Angelika Langer - FAQ Java Generics) fornito da una delle risposte alle altre domande (posto here per conveniente).

Mentre nel caso specifico non vi è alcuna differenza, la differenza si riduce semplicemente al modo in cui si tratterebbe internamente dei dati del tipo (all'interno del metodo). Vai con quello che sembra descrivere il tuo scopo il meglio. Se si hanno a che fare con dati di tipo sconosciuto e si richiede che il tipo di input specifico sia specificamente utilizzabile all'interno del metodo, è necessario seguire l'approccio generico. Se, d'altro canto, non si è e può essere sufficiente trattando tutti i dati di input come semplicemente del tipo di delimitazione (ad esempio AbstractClass nel proprio caso), è possibile utilizzare l'approccio con caratteri jolly limitato.