下界通配符

Kee*_*thi 5 java generics types

我一直在尝试了解Java Generics中的下界通配符的概念和基本原理。我可以理解只读的上限通配符背后的原因,以及在何处以及如何使用它。我仍然无法掌握下限通配符。我有一组遵循以下层次结构的类。(Automobile是基类。)

Automobile
    - Bus
        - Minibus
        - Doubledecker
        - Electricbus
    - Car
        - Sedan
        - Hatchback
        - Coupe
    - Truck
        - Minivan
        - Pickuptruck
        - Suv
            - Fullsuv
            - Midsuv
Run Code Online (Sandbox Code Playgroud)

现在,我试图建立一个(灵活的)列表,并向其中添加不同类型的对象。

import java.util.ArrayList;
import java.util.List;

public class Garage {

    public static void main(String[] args)
    {
        List<? super Suv> list = null;

        Suv s = new Suv();
        Truck t = new Truck();
        Automobile a = new Automobile();

        list = new ArrayList<Suv>();
        list.add(s); // declared as List<? super Suv> but actually List<Suv>. No compilation error

        list = new ArrayList<Truck>();
        list.add(t); // declared as List<? super Suv> but actually List<Truck>. Compilation error

        list = new ArrayList<Automobile>();
        list.add(a); // declared as List<? super Suv> but actually List<Automobile>. Compilation error
    }
}
Run Code Online (Sandbox Code Playgroud)

我能够添加的实例SuvList<? super Suv>。但是,当我尝试将Truck或的实例添加Automobile到同一列表时,出现编译错误。是不是List<? super Suv>足够灵活的采取的任何实例,Suv其超类或?TruckAutomobile在层次结构树中更高。为什么我不能将这些实例添加到列表中?

aio*_*obe 3

List<? super Suv>应理解为“元素类型是 的超类型的列表Suv

现在,让我们看看这两行:

list = new ArrayList<Automobile>();
list.add(a); // where a is an Automobile
Run Code Online (Sandbox Code Playgroud)

第一行没问题,因为ArrayList<Automobile>确实是“一个元素类型是 的超类型的列表Suv

但让我们读出第二行:将 some 添加Automobile到元素类型为 的超类型的列表中Suv

据编译器从静态类型得知,

  • list可以引用 a List<Truck>(因为Truck是 的超类型Suv)并且
  • t可以指 a Car(因为 aCarAutomobile

因此编译器会抱怨确保您没有将 a 添加CarTrucks.


有用的阅读: