这段代码:

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>这样的“裸露”泛型。

10-05 21:21