我无法弄清楚为什么不允许使用ArrayList <int>但允许使用ArrayList <int []>。
我的印象是收藏中不允许原始数据类型,为什么这是合法的?
Java中的array
是一个对象。在Java中,我们可以使用new
运算符创建数组,并且我们知道每个对象都是使用new运算符创建的。因此,我们可以说array
也是一个对象。
集合仅适用于任何Object
。 int
是原始数据类型,int[]
是Object。
这就是ArrayList<int>
不允许的原因,但允许使用ArrayList<int[]>
。
泛型仅适用于引用类型(任何对象)。
原始int
不是参考类型。
int[]
是,因为任何数组也是一个对象。
处理多个int值的正确方法是使用int[]
(不将它们放入列表中),或者使用List<Integer>
。哪一个选择真的取决于您的确切用例。
int是原始的。
int []是对象。
具有ANY_OBJECT的ArrayList有效。
带有ANY_PRIMITIVE的ArrayList无效。
并且因为int []是一个对象所以ArrayList是可能的,但对于int原语,ArrayList是INVALID。
Java中的数组是一个对象。在Java中,我们可以使用new运算符创建数组,并且我们知道每个对象都是使用new运算符创建的。
在Java中,每个数组类型都有一个类,因此有一个int []类,类似于float,double等。数组类型的直接超类是Object。每个数组类型都实现了Cloneable和java.io.Serializable接口。可以在数组上调用Object类的所有方法。这可以从下面的代码中检查:
public class Test {
public static void main(String[] args)
{
System.out.println(args instanceof Object);
int[] arr = new int[2];
System.out.println(arr instanceof Object);
}
}
输出:True True
ArrayList初始化中使用的菱形运算符指定泛型类型。泛型类型是通过类型参数化的泛型类或接口。
你可以在这里查看ArrayList的源代码:http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/java/util/ArrayList.java
您可以看到参数化构造函数中的elementData类型是Object。基元是不是对象的数据类型:
private transient Object[] elementData;
因此int是java中的原始数据类型,它不能用作泛型类型,其中int []具有直接超类Object,可以。
你可以在这里阅读更多相关信息:https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html