2012-07-16 16 views
47

Qual è la differenza tra queste 2 funzioni?WildCard Java Generics: <? estende Numero> vs <T estende Numero>

static void gPrint(List<? extends Number> l) { 
    for (Number n : l) { 
     System.out.println(n); 
    } 
} 

static <T extends Number> void gPrintA(List<T> l) { 
    for (Number n : l) { 
     System.out.println(n); 
    } 
} 

Vedo la stessa uscita.

+3

Forse perché non c'è differenza? –

+0

http://stackoverflow.com/questions/6008241/java-generics-e-e-t-what-is-the-difference – swapy

+0

perché non possiamo definire il nome della classe ma il nome della classe va bene? –

risposta

31

Non c'è differenza in questo caso, perché T non viene mai più utilizzato.

Il motivo per dichiarare uno T è in modo tale che è possibile fare nuovamente riferimento a esso, quindi vincolando due tipi di parametri o un tipo di ritorno insieme.

+0

concordato! Quindi c'è un caso in cui solo '?' farò il lavoro per me ma non "T". O tutto ciò che può essere fatto con jolly può essere fatto usando 'T'? –

+9

Se c'è solo un '?', Allora è equivalente. Se c'è più di un '?', Allora devi usare 'T' o'? ', A seconda se hai bisogno che i due tipi siano uguali, o vuoi che siano diversi. Se hai un metodo 'x ( a, b)', puoi chiamarlo con un numero intero e un lungo. Se hai 'T a, T b', entrambi devono essere dello stesso tipo. – Thilo

+1

Ma posso ancora fare x (T a, U b). Quindi qual è il modo preferito? È preferibile non utilizzare i caratteri jolly (quando possibile)? –

33

La differenza è che non è possibile fare riferimento a T quando si utilizza un carattere jolly.

Non siete in questo momento, quindi non c'è "nessuna differenza", ma ecco come si potrebbe usare T a fare la differenza:

static <T extends Number> T getElement(List<T> l) { 
    for (T t : l) { 
     if (some condition) 
      return t; 
    } 
    return null; 
} 

Ciò restituirà lo stesso tipo come ciò che è passato ., ad esempio in questi saranno entrambi compilazione:

Integer x = getElement(integerList); 
Float y = getElement(floatList); 
+0

Quindi quando è veramente necessario il carattere jolly? –

+2

Il carattere jolly non è realmente "necessario", ma prevede una minore digitazione quando effettivamente è un tipo non associato (non è necessario dargli un nome). Il codice risultante è equivalente. Questo è simile alla differenza tra 'int a = 1; restituisce a' contro "return 1". O scrivendo '' invece di '' – Thilo

4

T è un tipo limitato, vale a dire che cosa tipo che si utilizza, è necessario attenersi a quel tipo particolare che si estende Number, ad esempio, se si passa un tipo Double a un elenco, non è possibile passarlo un tipo Short come T di tipo Double e l'elenco è già limitato da tale tipo. Al contrario, se si utilizza ? (wildcard), è possibile utilizzare "qualsiasi" tipo che si estende Number (aggiungere entrambi Short e Double a tale elenco).

0

Quando si utilizza T è possibile eseguire tutti i tipi di azioni su Elenco. Ma quando usi non puoi eseguire l'aggiunta.

T - come il riferimento oggetto con accesso completo
? - dare l'accesso parziale

static void gPrint(List<? extends Number> l) { 
l.add(1); //Will give error 
for (Number n : l) { 
    System.out.println(n); 
} 

static <T extends Number> void gPrintA(List<T> l) { 
l.add((T)1); //We can add 
for (Number n : l) { 
    System.out.println(n); 
} 
Problemi correlati