Wildcard

di il
4 risposte

Wildcard

Buonasera,

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 qualcuno sapesse spiegarmi come utilizzarle gliene sarei grato

4 Risposte

  • Re: Wildcard

    ^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.
  • Re: Wildcard

    Qui: public static double somma(List<? extends Number> numeri) { ....... }; non potremmo dire che numeri è di tipo generico? Esempio: (List <T> numeri){...}?
  • Re: Wildcard

    ^Matteo^ ha scritto:


    Qui: public static double somma(List<? extends Number> numeri) { ....... }; non potremmo dire che numeri è di tipo generico? Esempio: (List <T> numeri){...}?
    Per il metodo somma che ho descritto prima, ci sono due forme possibili che contemplano la (co)varianza sulla parametrizzazione:

    1) La prima è la forma che ho già mostrato prima:

    public static double somma(List<? extends Number> numeri) { ....... }

    Questo metodo NON è "generico" nel senso che non dichiara una type variable con < > (es. <T> ).


    2) Esiste una seconda forma possibile, questa volta come metodo "generico":

    public static <T extends Number> double somma(List<T> numeri) { ....... }

    che ha una forma leggermente più lunga.


    A livello pratico non ci sono differenze, entrambe sono lecite ed accettano una qualunque lista parametrizzata come Number o sottotipo.
    La prima forma però è più semplice (nonché leggermente più corta) ed è generalmente più facile/immediata da capire. Quindi in un contesto come quello descritto, cioè di una somma di Number (dove conta solo estrarre l'oggetto i-esimo come Number), la PRIMA forma è tipicamente da preferire. Ecco perché ti ho detto prima quella.
  • Re: Wildcard

    Grazie per la risposta
Devi accedere o registrarti per scrivere nel forum
4 risposte