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>.