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 *
Inoltre, 'T' è un parametro di tipo per-metodo in questo caso, quindi tutte e tre le dichiarazioni sono sostanzialmente indipendenti l'una dall'altra. –
Ma perché viene chiamato il primo metodo? Se 'T' in' \\ 1' è uguale a 'Collection extends T>' in '\\ 3', quindi' found' in '\\ 1' deve essere di tipo' Collection estende> 'in' \\ 3'? Dove mi sbaglio? –
@assylias: Grazie: ho completamente trascurato questo dettaglio. - Quindi dopo aver aggiunto ' extends T>' per 'found' in' // 2' inizia a funzionare come previsto – Ralph