C'è una sottile differenza tra la notazione con i generics e quella con il tipo generico java.lang.Object
Infatti se scriviamo questo metodo:
Possiamo passare ad esso qualsiasi struttura dati ed avere l'output in stampa.
Es:
Se invece proviamo a cambiare la firma del metodo da List<?> a List<Object> il
codice non compila più, il messaggio è "The method stampa(List<Object>) in the type xxxxx is not applicable for the arguments (List<String>) "
dove xxx è il nome della classe da cui invochiamo il metodo.
La differenza quindi tra i due approcci è che usando List<Object> si incappa nel problema del subtyping, ossia il tipo List<String> poichè String è sottoclasse di object non va bene per invocare il metodo, bisognerà esplicitamente castare il parametro.
La notazione ? ci evita di effettuare cast e il nostro metodo funzionerà con Liste di qualsiasi tipo.
Infatti se scriviamo questo metodo:
public static void stampa(List<?> lista){
for(Object o:lista){
System.out.println("["+o+"]");
}
}
Possiamo passare ad esso qualsiasi struttura dati ed avere l'output in stampa.
Es:
List<String> ls=new ArrayList<>();
ls.add("uno");
ls.add("due");
ls.add("tre");
stampa(ls);
List<Integer> lista=new ArrayList<>();
lista.add(5);
lista.add(7);
lista.add(9);
stampa(lista);
Se invece proviamo a cambiare la firma del metodo da List<?> a List<Object> il
codice non compila più, il messaggio è "The method stampa(List<Object>) in the type xxxxx is not applicable for the arguments (List<String>) "
dove xxx è il nome della classe da cui invochiamo il metodo.
La differenza quindi tra i due approcci è che usando List<Object> si incappa nel problema del subtyping, ossia il tipo List<String> poichè String è sottoclasse di object non va bene per invocare il metodo, bisognerà esplicitamente castare il parametro.
La notazione ? ci evita di effettuare cast e il nostro metodo funzionerà con Liste di qualsiasi tipo.
Nessun commento:
Posta un commento