^Matteo^ ha scritto:
Ho da qualche settimana, all’università, fatto le wildcard a lezione.
Non capisco come e quando applicarle applicarle visto la possibilità di utilizzo delle classi e metodi generici.
Se hai studiato i
generics, dovresti sapere che sono "invarianti", ovvero es. List<String>
NON è un sottotipo di List<Object> (mentre invece gli array sono "covarianti", cioè String[]
È un sottotipo di Object[] ).
I wildcard sono stati introdotti per fornire una forma (ridotta) di "polimorfismo" anche a livello delle parametrizzazioni.
Se voglio fare un metodo che data una lista di oggetti Number mi calcola la somma come double, una possibilità è:
public static double somma(List<Number> numeri) { ....... }
Il punto/problema è che a questo metodo posso passare una qualunque implementazione di List (es. ArrayList, LinkedList, ecc...) ma SOLO parametrizzata come <Number>. Non posso passargli un ArrayList<Integer> o LinkedList<Double> ecc...
Invece applicando un
bounded wildcard con extends:
public static double somma(List<
? extends Number> numeri) { ....... }
allora anche la parametrizzazione può variare, però con il limite superiore di Number. Cioè posso passare qualunque cosa che sia parametrizzato Number o "sotto" (sottotipo di) Number.