2011-09-27 14 views
10

perché faqual è la differenza? e T in firme di classe e metodo?

public interface ArrayOfONEITEMInterface <T extends ONEITEMInterface>{ 
    public List<T> getONEITEM(); 
} 

compilazione, ma non

public interface ArrayOfONEITEMInterface <? extends ONEITEMInterface>{ 
    public List<?> getONEITEM(); 
} 

qual è la differenza tra? e T in firme di classe e metodo?

risposta

17

? è un jolly e significa qualsiasi sublass di ONEITEMInterface compreso se stesso.

T è un specifico implementazione di ONEITEMInterface in questo caso.

Poiché ? è un carattere jolly, non esiste alcuna relazione tra lo ? nella dichiarazione della classe e lo ? nella dichiarazione del metodo, quindi non verrà compilato. Solo lo List<?> getONEITEM(); verrà compilato.


Il primo scenario , l'intera classe può gestire esattamente uno tipo di Bar per esempio.

interface Foo<T extends Bar> { 
    List<T> get(); 
} 

Il secondo scenario permette ogni istanza per operare su qualsiasi sottotipo di Bar

interface Foo { 
    List<? extends Bar> get() 
} 
1

T è un segnaposto per un tipo che verrà fornita da una classe che implementa o istanzia .

? è un segnaposto che dice "Non so o mi interessa cosa sia il tipo generico" generalmente usato quando il lavoro che svolgerete sull'oggetto contenitore non ha bisogno di conoscere il tipo.

Il motivo per cui non è possibile utilizzare "?" nella definizione classe/interfaccia è perché c'è il valore sta dicendo di definire il nome del segnaposto (e il tipo verrà fornito altrove). Mettendo un '?' non ha senso

Inoltre, il segnaposto non ha bisogno di essere T, può qualsiasi variabile Java standard. Per convenzione, è un carattere capitale, ma non è necessario.

0

? ti permette di avere una lista di tipi sconosciuti, dove T richiede un tipo definito.

2

La clausola <T extends ONEITEMInterface> sta dichiarando un parametro di tipo denominato T. Ciò consente al tuo tipo generico, ArrayOfONEITEMInterface, di fare riferimento al parametro altrove. Ad esempio è possibile dichiarare un metodo come void add(T t).

Senza denominare il parametro tipo, come si fa ad accedervi? Se non fai mai riferimento al parametro type, perché il tuo tipo è generico in primo luogo?Ad esempio, non è necessario un tipo parametrico a fare qualcosa di simile:

public interface ArrayOfONEITEMInterface { 
    List<? extends ONEITEMInterface> getONEITEM(); 
} 

Non ha senso dichiarare un parametro di tipo anonimo, quindi è sintatticamente illegale.

Problemi correlati