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

数组声明和集合声明有什么区别[重复]

戈安翔
2023-03-14
 1.  List<Car> carList = new ArrayList<Sedan>();

 2.  List<Car> carList = new ArrayList<Car>();
    carList.add(new Sedan());

%1有编译器错误,而%2是合法的。

为什么变量声明的类型必须与我们传递给对象类型的类型匹配(不允许派生类型)?我使用的数组如下所示,这是完全正确的:

int SIZE = 10;
Car[] carArray = new Sedan[SIZE];

有人能告诉我为什么集合必须声明为条件2吗?谢谢

共有1个答案

章飞虎
2023-03-14

sedan[]car[]的子类型。但这对类型安全有非常负面的影响,因为下面的代码因此是合法的:

Sedan[] sedans = new Sedan[10];
Car[] cars = sedans; // legal, since Sedan[] extends Car[]
cars[0] = new Car(); // Houston, we have a problem

这段代码在运行时会导致ArrayStoreException,因为一个假定只包含轿车的数组会包含一个非轿车。

泛型的目标是拥有类型安全的集合。因此决定对它们进行设计,以便在编译时而不是运行时检测到上述问题。集合比数组使用得多,使它们具有类型安全的特性是一件非常好的事情。

 类似资料:
  • 问题内容: 声明这样的数组之间的真正区别是什么: 和 问题答案: 有所不同,但在该示例中没有区别。 使用更冗长的方法:在参数中确实有一个额外的选择:如果将数字传递给构造函数,则将获得该长度的数组: 为了说明创建数组的不同方法: 另一个区别是,使用时,您可以设置数组的大小,这会影响堆栈的大小。如果您遇到堆栈溢出(Array.push与Array.unshift的性能)(当数组的大小超过堆栈的大小并必

  • 问题内容: 两者的含义使我难以理解。 问题答案: 甲声明引入的标识符和描述了它的类型,无论是类型,对象,或功能。声明是编译器需要接受对该标识符的引用的内容。这些是声明: 甲定义实际实例化/器具该标识符。这是什么样的连接器需要以链接引用这些实体。这些是与上述声明相对应的定义: 可以使用定义代替声明。 可以根据需要多次声明标识符。因此,以下内容在C和C ++中是合法的: 但是,必须定义一次。如果忘记定

  • 问题内容: 我想知道java集合API中上述两者之间的实际区别是什么。我是Java Collections API的新手。我知道List是ArrayList类实现的接口。 问题答案: 在你的声明1,因为你是指因为虽然它仍然是, 因此你可以使用在可用的方法唯一接口。如果您正在使用跨class.method功能,这是更好的声明。 同样,任何接受方法都可以接受任何实现类,例如或您的自定义实现类。 您的第

  • 人们似乎在说malloc在使用数组时有多棒,当你不知道一个数组在编译时有多少元素时,你可以使用它(?)。没有malloc你就不能这么做吗?例如,如果我们知道一个字符串的最大长度为10,那么下面的结果是否足够接近同一事物?。。。除了能够释放内存之外。 和

  • 问题内容: 我对这两个词感到非常困惑。我检查了stackoverflow,对于C ++有一个类似的问题,但对于Java没有。 有人可以解释一下Java的两个术语之间的区别吗? 问题答案: 概念上的区别很简单: 声明 :您 声明的 是某些东西,例如类,函数或变量。你不说任何事情 什么 是类或函数的样子,你刚才说,它的存在。 定义 :您 定义 某种事物的实现方式,例如类,函数或变量,即您说的 是 实际

  • 问题内容: 是什么区别,并宣布一组样式时的元素,什么是决定使用哪一个时发挥作用的语义? 问题答案: 是的,它们是不同的… 是[ID选择器,用于定位具有唯一ID的_单个_特定元素,但。是一个类选择器,用于将特定类的 多个 元素作为目标。换一种方式: 将为带有属性声明的 单个 元素设置样式 将使用属性设置_所有_元素的样式(您也可以将多个类分配给一个元素,只需将它们用空格隔开,例如) 典型用途 一般来