For the variable you gave:
List<? extends Reader> weirdList;
All of the following assignments are valid:
weirdList = new ArrayList<Reader>();
weirdList = new ArrayList<FileReader>();
weirdList = new ArrayList<BufferedReader>();
weirdList = new ArrayList<InputStreamReader>();
Hopefully this explains your compile error. What you're trying makes sense if weirdList
holds a value of type ArrayList<BufferedReader>
, but doesn't make sense for a value of type ArrayList<FileReader>
. Since a variable of type List<? extends Reader>
can hold a value of either type (and more!), Java calls that an error.
Generics in Java are hard to get your head around. You can think of the List<? extends Reader>
type as being mostly useful for assignment or parameter types in methods so that they can accept a wide variety of types. For "regular use", you're probably better off with a "bare" generic like List<Reader>
or even List<BufferedReader>
.