List<int> list; //compile-time error
List<int[]> list1; //works fine
这种行为有什么理由吗?我知道原语需要加框,但为什么不是原始数组呢?
答案 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[]
。所有这些都会在编译时导致泛型数组创建错误。