Java 为什么ArrayList可以存储不同的对象,而数组不能?

Java 为什么ArrayList可以存储不同的对象,而数组不能?,java,arrays,arraylist,Java,Arrays,Arraylist,将不同类型的对象放入一个将抛出一个,而将不同类型的对象放入一个作品 据我所知,ArrayList是构建在数组之上的,那么它为什么在那里工作呢?它的实施方式是否不同 我搜索了,但没有找到答案。ArrayList有一个名为的字段,这意味着ArrayList支持添加各种对象引用。这也意味着ArrayList不支持基本类型,例如int或char,而是分别支持它们的包装类Integer和Character 数组通常用于单类型元素,因为它们的声明,除非您将它们声明为Object[]。对于基元类型,没有泛型数

将不同类型的对象放入一个将抛出一个,而将不同类型的对象放入一个作品

据我所知,ArrayList是构建在数组之上的,那么它为什么在那里工作呢?它的实施方式是否不同


我搜索了,但没有找到答案。

ArrayList
有一个名为的字段,这意味着
ArrayList
支持添加各种对象引用。这也意味着
ArrayList
不支持基本类型,例如
int
char
,而是分别支持它们的包装类
Integer
Character

数组通常用于单类型元素,因为它们的声明,除非您将它们声明为
Object[]
。对于基元类型,没有泛型数组,只有基元数组
int[]
char[]
等等


如果您创建一个Object[]数组,并放入字符串和日期对象,它将抛出一个异常

这里有一段代码证明了相反的情况,通过使用
对象[]
存储
字符串和
日期,编译和执行都没有问题:

Object[] objects = { "hello", "world", new Date() };
System.out.println(Arrays.toString(objects));
输出(日期将取决于您电脑的当前时间):


您可以检查它是否正常工作。

ArrayList
有一个名为的字段,这意味着
ArrayList
支持添加各种对象引用。这也意味着
ArrayList
不支持基本类型,例如
int
char
,而是分别支持它们的包装类
Integer
Character

数组通常用于单类型元素,因为它们的声明,除非您将它们声明为
Object[]
。对于基元类型,没有泛型数组,只有基元数组
int[]
char[]
等等


如果您创建一个Object[]数组,并放入字符串和日期对象,它将抛出一个异常

这里有一段代码证明了相反的情况,通过使用
对象[]
存储
字符串和
日期,编译和执行都没有问题:

Object[] objects = { "hello", "world", new Date() };
System.out.println(Arrays.toString(objects));
输出(日期将取决于您电脑的当前时间):


您可以检查它是否工作。

只有将数组
SomeClass[]
强制转换为数组
TheSuperClass[]
时,才会出现
ArrayStore异常。它不会在其他情况下被抛出。例如:

A[] array = new A[100];
array
的元素可以是类
A
的对象或
A
的任何子类,您永远不会得到
ArrayStoreException
。同样地:

Object[] array = new Object[100];
这个数组的元素可以是任何东西。无论您将
array[n]
分配给什么,这都不会引发
ArrayStoreException

当您使用
new
创建一种类型的数组,然后(可能隐式地)将其强制转换为某个超类类型的数组时,就会出现问题:

A[] array = new B[100];   // legal if B is a subclass of A
C[] array2 = new C[100];  
Object[] array3;
array3 = array2;          // legal even though `array2` is C[]
这种演员阵容是合法的但是如果您随后尝试分配不适合用于创建数组的类型的内容,您将得到
ArrayStoreException

array[1] = new A();
唯一可以分配到
数组[n]
中的是
B
B
的子类。编译器在编译时无法捕获上述错误,但在运行时会引发异常

array3[1] = "some string";
即使
array3
对象[]
数组,也不能将任何旧对象指定给其元素;它们必须是
C
C
的子类

这对于
ArrayList
来说不是问题的原因是您不能进行相同类型的转换

ArrayList<A> array = new ArrayList<B>();   // illegal even if B is a subclass of A
ArrayList<C> array2 = new ArrayList<C>();
ArrayList<Object> array3;
array3 = array2;  // illegal

其中
x
可以有任何类型;它不必是
C
类型。但是永远,永远,永远不要这样做。特别是在任何程序中,我可能需要维护一天。

只有将数组
SomeClass[]
强制转换为数组
TheSuperClass[]
时,才会出现
ArrayStore异常。它不会在其他情况下被抛出。例如:

A[] array = new A[100];
array
的元素可以是类
A
的对象或
A
的任何子类,您永远不会得到
ArrayStoreException
。同样地:

Object[] array = new Object[100];
这个数组的元素可以是任何东西。无论您将
array[n]
分配给什么,这都不会引发
ArrayStoreException

当您使用
new
创建一种类型的数组,然后(可能隐式地)将其强制转换为某个超类类型的数组时,就会出现问题:

A[] array = new B[100];   // legal if B is a subclass of A
C[] array2 = new C[100];  
Object[] array3;
array3 = array2;          // legal even though `array2` is C[]
这种演员阵容是合法的但是如果您随后尝试分配不适合用于创建数组的类型的内容,您将得到
ArrayStoreException

array[1] = new A();
唯一可以分配到
数组[n]
中的是
B
B
的子类。编译器在编译时无法捕获上述错误,但在运行时会引发异常

array3[1] = "some string";
即使
array3
对象[]
数组,也不能将任何旧对象指定给其元素;它们必须是
C
C
的子类

这对于
ArrayList
来说不是问题的原因是您不能进行相同类型的转换

ArrayList<A> array = new ArrayList<B>();   // illegal even if B is a subclass of A
ArrayList<C> array2 = new ArrayList<C>();
ArrayList<Object> array3;
array3 = array2;  // illegal

其中
x
可以有任何类型;它不必是
C
类型。但是永远,永远,永远不要这样做。特别是在任何我可能需要坚持一天的计划中。

你是在比较苹果吗?例如,
Object[]
ArrayList
?你是在比较苹果吗?例如,
Object[]
ArrayList
?只是一个问题,ArrayList不是模板化的吗?这不意味着它有一个t[]元素数据,除非您将t定义为对象吗?或者模板是可选的,默认为Object[]?@StealthyHunter7,即