Avrei bisogno di un aiuto a capire bene i generics e le wildcard. Ho scritto precedentemente un testo lunghissimo, ma quando ho fatto invia mi ha cancellato tutto, è stato un pochino frustrante, quindi perdonatemi se ora sarò più conciso.
Ho recuperato alcuni esami passati e ci sono questi esercizi:
List<Object> listOne;
List<?> listTwo;
List<? extends Number> listThree;
List<? super Integer> listFour;
Quale tipologia di oggetto può essere recuperato/salvato nelle seguenti liste?
Le liste in java sono Invarianti quindi se ci aspettiamo un tipo T, dobbiamo avere per forza un tipo T e non un suo sottotipo come nel caso degli array che sono invarianti.
Quindi nella prima lista posso salvare per esempio ArrayList<Object>, mentre nel secondo posso salvare un ArrayList<T> ovvero un qualsiasi tipo di arraylist.
Nella terza lista ho covarianza quindi posso passare una qualsiasi lista che sia sottotipo di Number, mentre nella quarta lista ho controvarianza e posso passare qualsiasi lista sia supertipo di Integer.
Considerando le liste definite precedentemente, descrivere la correttezza dei seguenti comandi.
listOne.add(10);
listTwo.add(10);
Object o = listTwo.get(0);
listThree.add(0);
Number n = listThree.get(0);
listFour.add(10);
Number n1 = listFour.get(0);
Sui primi tre comandi ho alcuni dubbi. Il primo comando è valido perché un Integer è anche un object, il secondo e il terzo non so cosa rispondere.
Per quanto riguarda listThree siccome ho covarianza posso recuperare un valore perché sono sicuro di avere un Number, ma non aggiungere alcun valore perché non ne conosco effettivamente il tipo(per esempio ho una lista di Integer e sarebbe scorretto aggiungere un Number).
Per la listFour invece, avendo controvarianza, posso salvare un Integer perché è quello che mi aspetto, mentre non posso recuperare il valore perché non ho la certezza che sia effettivamente un Integer.
Inoltre che differenza c'è tra un parametro list<Object> e un parametro list<?> ?
Che garanzia ho su una variabile dichiata list<? extends ClassA>?
Potrebbe essere corretta come risposta ho la garanzia che ogni Oggetto della lista sia di tipo ClassA?
Come possiamo usare, invece, un oggetto del tipo Function<? super ClassA,Integer>?
Questa non so proprio risponderla scusate, non cerco il compitino risolto, ma ci ho perso una settimana dietro e ho l'esame a breve e ancora non capisco.
Grazie dell'aiuto