domenica 27 ottobre 2013

Differenze tra uso dei generics e il tipo object

C'è una sottile differenza tra la notazione con i generics e quella con il tipo generico java.lang.Object
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