这段代码:
List<? extends Reader> weirdList;
weirdList.add(new BufferedReader(null));
的编译错误为
为什么? BufferedReader扩展了阅读器,那么为什么不匹配呢?
最佳答案
对于您给的变量:
List<? extends Reader> weirdList;
以下所有分配均有效:
weirdList = new ArrayList<Reader>();
weirdList = new ArrayList<FileReader>();
weirdList = new ArrayList<BufferedReader>();
weirdList = new ArrayList<InputStreamReader>();
希望这可以解释您的编译错误。如果
weirdList
拥有ArrayList<BufferedReader>
类型的值,那么您正在尝试的事情就有意义了,但对于ArrayList<FileReader>
类型的值却没有意义。由于类型为List<? extends Reader>
的变量可以保存任何一个类型的值(甚至更多!),因此Java将该错误称为错误。Java中的泛型很难引起您的注意。您可以认为
List<? extends Reader>
类型对于方法中的赋值或参数类型最有用,因此它们可以接受各种类型。对于“常规使用”,最好使用List<Reader>
甚至List<BufferedReader>
这样的“裸露”泛型。