为什么原语不能存储在Java集合中,而原始数组可以存储?

Ano*_*W1z 1 java

List<int> list; //compile-time error
List<int[]> list1; //works fine
Run Code Online (Sandbox Code Playgroud)

这种行为有什么理由吗?我知道原语需要加框,但为什么不是原始数组呢?

And*_*mas 7

因为Java数组是对象,而不是基元.并且您可以存储对作为泛型类型实现的Java集合中的对象的引用.

Java语言规范,第10章:数组:

在Java编程语言中,数组是对象(§4.3.1),是动态创建的,可以分配给Object类型的变量(§4.3.2).可以在数组上调用Object类的所有方法.

请注意,数组和泛型并不总能很好地协同工作.虽然您可以创建数组集合,但无法创建集合数组.在运行时执行阵列内容的类型检查.但是由于类型擦除,在运行时不知道参数化类型的集合.来自Joshua Bloch的"Effective Java",第2版,"第25项:首选列表到数组":

例如,创建泛型类型,参数化类型或类型参数的数组是非法的.这些数组创建表达式都不合法:new List<E>[], new List<String>[], new E[].所有这些都会在编译时导致通用数组创建错误.