数组声明和集合声明有什么不同。

12 浏览
0 Comments

数组声明和集合声明有什么不同。

这个问题已经有了答案

List是List的子类吗?为什么Java泛型不是隐式多态的?

为什么数组是协变的,但泛型是不变的?

 1.  List carList = new ArrayList();
 2.  List carList = new ArrayList();
    carList.add(new Sedan());

条件1会产生编译错误,条件2合法。

为什么变量声明的类型必须与参数对象类型相匹配(不允许派生类型)?我使用Array的方式是正确的:

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

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

在你的第一种情况下,你实际上是创建了一个ArrayList来容纳各种汽车对象,然后尝试将此变量分配给SedansArrayList。这在其核心上不起作用,因为你从大到小(Sedan是Car,但Car可能不是Sedan)。

基本上,你的case1中的carList不起作用,因为对于泛型,任何Car都应该能够放入carList中。这意味着我可以在添加Sedan之后立即调用carList.add(new Compact();

Case 2遵循这种惯例。

当使用泛型时,我喜欢这样考虑:在第一个案例中,实际上创建了两种不同类型的对象实例。如果您愿意,想象一下ArrayListCarArrayListSedan。每个都专门用于接收其特定的参数。虽然数组会工作,但这是设计的方式,它会让人感到困惑。

0
0 Comments

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,因为一个只能包含轿车的数组会包含非Sedan车辆。

泛型的目标是拥有类型安全的集合。因此决定设计它们,以便以上问题可以在编译时而不是运行时被检测到。Collections比数组更常用,让它们具有类型安全性是非常好的事情。

因此他们决定List不会成为List

0