我有一个非常基础的问题。
下面的代码无法编译(假设苹果扩展了水果):
List<? extends Fruit> numbers = new ArrayList<>();
numbers.add(new Apple()); //compile time error
阅读关于“为什么不”的内容时,我理解了单词但没有理解概念:)
首先假设Fruit不是抽象类。我理解,因为我们处理多个子类型,所有这些类型都扩展自Fruit。据说由于我们无法确定水果的确切类型,所以我们无法将任何东西放入集合中。有几件事情我不明白:
1) 显然我们无法知道它是哪种水果,这让我感到困惑。在遍历集合时,我们难道不能通过typeof或其他instanceof检查来确定特定的类型吗?
2) 假设Fruit是一个具体类,为什么我们不能添加Fruit的实例呢?这似乎有道理,因为您至少会知道Fruit的API。即使您不知道Fruit的确切子类型,您也可以调用Fruit()上的标准方法。
我觉得这应该很明显,但是某些地方对我来说不太一样。感谢任何帮助。谢谢!
new Apple()
(即括号丢失)吧? - 5ar