2013-08-07 22 views
14

Ho 3 metodi:Generics vs. overloading dei metodi

//1 -- check one item 
public static <T> void containsAtLeast(String message, 
             T expectedItem, 
             Collection<? extends T> found) { 
    if (!found.contains(expectedItem)) 
     Assert.fail("...");   
} 

//2 -- check several items 
public static <T> void containsAtLeast(String message, 
             Collection<? extends T> expectedItems, 
             Collection<T> found) { 
    for (T exptetedItem : expectedItems) 
     containsAtLeast(message, exptetedItem, found);   
} 

//3 -- check several items, without message parameter 
public static <T> void containsAtLeast(Collection<? extends T> expectedItems, 
             Collection<? extends T> found) { 
    containsAtLeast(null, expectedItems, found); 
} 

mi aspetterei che il metodo //3 invocare //2 ma non lo fa, si invoca il metodo //1. C'è un errore in quello che mi aspetto?

* Io uso SDK 1.7.0_25 ed Eclipse 4.3 *

risposta

12

tuo secondo metodo prevede che il tipo generico di expectedItems (? extends T) di essere un sottotipo del tipo generico di found (T).

Nel terzo metodo, non esiste una relazione di sottotipo tra i due tipi generici. Entrambi estendono T ma potrebbero essere fratelli per esempio.

Quindi il secondo metodo non può essere chiamato.

Esempio: immaginate si chiama il terzo metodo con quei tipi:

containsAtLeast(Collection<Integer> e, Collection<String> f) 

Così il T nel terzo metodo è Object. E il tuo primo metodo viene chiamato con T = Object.

+0

Inoltre, 'T' è un parametro di tipo per-metodo in questo caso, quindi tutte e tre le dichiarazioni sono sostanzialmente indipendenti l'una dall'altra. –

+0

Ma perché viene chiamato il primo metodo? Se 'T' in' \\ 1' è uguale a 'Collection ' in '\\ 3', quindi' found' in '\\ 1' deve essere di tipo' Collection > 'in' \\ 3'? Dove mi sbaglio? –

+2

@assylias: Grazie: ho completamente trascurato questo dettaglio. - Quindi dopo aver aggiunto '' per 'found' in' // 2' inizia a funzionare come previsto – Ralph

Problemi correlati