当前位置: 首页 > 知识库问答 >
问题:

下界通配符

骆文彬
2023-03-14
Automobile
    - Bus
        - Minibus
        - Doubledecker
        - Electricbus
    - Car
        - Sedan
        - Hatchback
        - Coupe
    - Truck
        - Minivan
        - Pickuptruck
        - Suv
            - Fullsuv
            - Midsuv

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

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
    }
}

我可以将SUV的实例添加到List<?超级SUV>。但是,当我试图将TruckAutomobile的实例添加到同一个列表中时,会出现编译错误。列表不是<吗?super SUV>是否足够灵活,可以使用SUV或其超级类的任何实例?卡车汽车在层次结构树中位于较高位置。为什么我不能将这些实例添加到列表中?

共有1个答案

濮丰
2023-03-14

<代码>列表<?super SUV>应读为“其元素类型为SUV超级类型的列表”。

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

list = new ArrayList<Automobile>();
list.add(a); // where a is an Automobile

第一行可以,因为ArrayList 实际上是“一个列表,其元素类型是SUV的超级类型”。

    null
    null
 类似资料:
  • null 为什么我不能在MyList中添加对象。因为如果我们使用super,这意味着这个列表可以包含在Java类的继承制度中等于或高于number的对象。因此应该按照该语句在列表中添加新的Object()。 多谢了。

  • 为什么会出现这种情况?请跟我解释一下。

  • 上限通配符下限通配符 有人能帮我理解一下吗?

  • 这个问题的答案表明,当方法采用通配符泛型类型时,可以访问或修改集合,但不能同时访问或修改集合。(凯西和伯特) 据我所知,方法do1有,因此d2只能被访问,不能被修改。方法d2具有,因此可以访问和修改c2,并且没有编译错误。 通用指南

  • 考虑以下示例: 我知道下界通配符接受通配符中给定类的所有超类(这里是IOException)。 为什么在上述情况下编译器会显示编译错误?

  • 问题内容: 您好直接从Oracle http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html提供的Java教程中 我知道编译时的类型擦除。而且我也知道,一个类型(无界)将被Object取代。知道在编译时如何使用无界通配符进行编译吗?只是删除它,因为它是原始类型? 提前致谢。 问题答案: 假设我们有一个