2013-10-28 31 views
1

在了解Java通配符时,我发现自己误解了这个主题,所以。
Java通配符写入和读取权限

  1. Upper Bound让我只读泛型类的成员
  2. Lower Bound让我写信给成员,但只有当它是类型的下限。

List< ? extends Vehicle > vehicleList = new ArrayList<Car>();
vehicleList.add(new Scooter()); // Compile-time Error!

编译器不会让我们写任何东西在这里,因为他不能保证该列表的元素将是正确的类型(稍后读)。

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

这是因为编译器可以确保最低类型始终是汽车。然后我们只能通过它汽车
对吗?

+1

是;这被称为协同/反方差。 – SLaks

回答

0

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

  • 的ArrayList <汽车>
  • 的ArrayList <车辆>
  • 的ArrayList <对象>
  • 链表<汽车>
  • 链表<车辆>
  • 链表<对象>

现在,由于ArrayList<Car>LinkedList<Car>不允许添加类别为Vehicle的对象,因此如果carList的类型为List<? super Car>,编译器不能让您编写carList.add(new Vehicle())