Array声明和Collection声明之间有什么区别

Hai*_*ang 0 java generics collections typesafe

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

 2.  List<Car> carList = new ArrayList<Car>();
    carList.add(new Sedan());
Run Code Online (Sandbox Code Playgroud)

1有编译错误,2是合法的.

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

int SIZE = 10;
Car[] carArray = new Sedan[SIZE];
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么收藏品必须声明为条件2?谢谢

JB *_*zet 5

Sedan[]是一个子类型Car[].但这会对类型安全产生非常不利的影响,因为以下代码是合法的:

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

此代码在运行时导致ArrayStoreException,因为应该只包含轿车的数组将包含非轿车.

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

所以他们决定一个List<Sedan>不会是一个List<Car>.