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

时间:2015-06-25 15:54:55

标签: java

List<int> list; //compile-time error
List<int[]> list1; //works fine

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

1 个答案:

答案 0 :(得分:7)

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

来自Java language specification, Chapter 10: Arrays

  

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

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

  

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