Stavo cercando di comprendere il seguente esempio di wildcards:
Quello che mi sfugge è perchè il get non da problemi mentre il set si?codice:package Pack; import java.util.ArrayList; class Fruit{} class Apple extends Fruit{} class Orange extends Fruit{} public class older<T> { private T value; public older(){} public older(T val){value = val;} public T get(){return value;} public void set(T val){value = val;} static public void main(String[] args) { older<? extends Fruit> fruit = new older<Apple>(); Fruit p = fruit.get(); //Non si può fare, perchè? //fruit.set(new Apple()); } }
L'unica motivazione che mi è venuta in mente è che in caso di get tu fai un assegnazione ad una variabile di tipo Fruit, quindi sei sicuro che qualsiasi oggetto contenuto in older sarà una sua sottoclasse.
Riguardo al set invece il problema potrebbe essere che tu sostanzialmente potresti istanziarlo come qualsiasi sotto tipo di fruit. Ad esempio potresti istanziarlo come new older<GreenApple> dove magari GreenApple estende apple. A quel punto tu non sai con cosa hai istanziato older e se passi ad esempio un Apple sarà sottoclasse di Fruit (e quindi vale il polimorfismo) ma non sottoclasse di GreenApple (bensì superlcasse) e genererebbe errore. E' cosi?
Ovvero il compilatore in un metodo che ritorna un qualcosa con questo tipo di wildcards non ha problemi, perchè tanto guarda il tipo della variabile su cui effettui l'assegnazione. Se invece viene passata come parametro non saprebbe identificarla e quindi non te lo fa fare.
E' questo il succo del discorso oppure ho fatto solo una gran confusione?![]()


Rispondi quotando