数组声明和集合声明有什么不同。
数组声明和集合声明有什么不同。
这个问题已经有了答案:
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日
在你的第一种情况下,你实际上是创建了一个ArrayList
来容纳各种汽车对象,然后尝试将此变量分配给Sedans
的ArrayList
。这在其核心上不起作用,因为你从大到小(Sedan是Car,但Car可能不是Sedan)。
基本上,你的case1
中的carList
不起作用,因为对于泛型,任何Car都应该能够放入carList
中。这意味着我可以在添加Sedan之后立即调用carList.add(new Compact();
。
Case 2遵循这种惯例。
当使用泛型时,我喜欢这样考虑:在第一个案例中,实际上创建了两种不同类型的对象实例。如果您愿意,想象一下ArrayListCar
和ArrayListSedan
。每个都专门用于接收其特定的参数。虽然数组会工作,但这是设计的方式,它会让人感到困惑。
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
。