1

在学习 Java 通配符时,我发现自己对这个主题有误解,所以。

  1. Upper Bound允许我只读泛型类的成员
  2. Lower Bound允许我写信给成员,但前提是它是类型下限
List<? extends Vehicle> vehicleList = new ArrayList<Car>(); 
vehicleList.add(new Scooter()); // Compile-time Error!

编译器不会让我们在这里写任何东西,因为他不能确保 list 的元素是正确的类型(供以后阅读)。

List<? super Car> carList = new ArrayList<Car>();
carList.add(new Car()); // Ok
carList.add(new Vehicle()); // Compile-time Error

发生这种情况是因为编译器可以确保最低类型始终是 Car。然后我们只能通过Car。我对吗?

4

2 回答 2

2

请记住,这List<? super Car>是一种抽象类型。想想这种类型的对象的实际具体类。所有这些都是可能性,显然还有其他可能性。

  • ArrayList <汽车>
  • ArrayList <车辆>
  • 数组列表 <对象>
  • 链表 <汽车>
  • 链表 <车辆>
  • 链表<对象>

现在,由于ArrayList<Car>并且LinkedList<Car>不允许添加类为 的对象Vehicle,编译器不能让您编写carList.add(new Vehicle())if carListis of type List<? super Car>

于 2013-10-28T19:27:12.327 回答
2

你基本上是对的。

  • List<? extends Vehicle>应该被认为是一个未知的 Vehicle 子类的列表(包括 Vehicle 本身)。

    因此,没有任何东西可以安全地插入其中(除了null)。

    从列表中读取时,它的对象可以安全地分配给Vehicle.

  • 相反,List<? super Vehicle>是一个未知超类 Vehicle(包括 Vehicle)的列表。

    的每个子类Vehicle都可以安全地插入其中。

    从列表中读取时,其对象只能分配给Object.

于 2018-04-17T07:03:58.067 回答