<? extends > Java syntax
generics, java
Solution
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>`.
Problem
This code: ``` List<? extends Reader> weirdList; weirdList.add(new BufferedReader(null)); ``` has a compile error of The method add(capture#1-of ? extends Reader) in the type List is not applicable for the arguments (BufferedReader) Why? BufferedReader extends reader, so why isn't that a "match"?