Per la variabile hai dato:
List<? extends Reader> weirdList;
Tutte le seguenti assegnazioni sono validi:
weirdList = new ArrayList<Reader>();
weirdList = new ArrayList<FileReader>();
weirdList = new ArrayList<BufferedReader>();
weirdList = new ArrayList<InputStreamReader>();
Speriamo che questo spiega il vostro errore di compilazione. Quello che stai cercando ha senso se weirdList
contiene un valore di tipo ArrayList<BufferedReader>
, ma non ha senso per un valore di tipo ArrayList<FileReader>
. Poiché una variabile di tipo List<? extends Reader>
può contenere un valore di uno dei due tipi (e anche di più!), Java chiama un errore.
I generici in Java sono difficili da capire. Puoi pensare che il tipo List<? extends Reader>
sia utile soprattutto per i tipi di assegnamento o parametro nei metodi, in modo che possano accettare un'ampia varietà di tipi. Per "uso regolare", probabilmente stai meglio con un generico "nudo" come List<Reader>
o anche List<BufferedReader>
.
possibile duplicato di [Java Generics WildCard Domanda: Elenco extends A>] (http://stackoverflow.com/questions/5495383/java-generics-wildcard-question-list-extends-a) – yshavit
(FWIW, cosa vuoi qui è 'Lista', non 'Lista estende Reader>'.) –