如果我们有一个 Type[],我们只能在其中存储 Type 或其子类型。 ArrayList 也是如此。那么为什么说一个是同质的,另一个不是同质的呢?
数组对添加元素的类型进行运行时检查。也就是说,如果添加了不同类型的新元素,则会在运行时抛出
ArrayStoreException
。这就是为什么他们被认为是“同质的”。
对于
ArrayList
(一般来说List
)来说,情况并非如此。由于运行时的类型擦除,它实际上可以容纳任何对象。
运行时抛出异常如下:
Object[] array = new String[3];
array[0] = "a";
array[1] = 1; // throws java.lang.ArrayStoreException
与下面的不同,它编译和运行没有问题(尽管有编译器警告,因为它没有正确使用泛型):
ArrayList list = new ArrayList<String>();
list.add("a");
list.add(1); // OK
list.add(new Object()); // OK
正确使用泛型,即在类型
list
之上声明变量 ArrayList<String>
而不是 ArrayList
,可以在编译时避免问题:
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add(1); // compilation error
list.add(new Object()); // compilation error
但即使使用通用声明的列表,您也可以在运行时进行类似的工作而不会出现异常:
ArrayList<String> list = new ArrayList<String>();
list.add("a");
Method[] methods = List.class.getMethods();
for(Method m : methods) {
if(m.getName().equals("add")) {
m.invoke(list, 1);
break;
}
}
System.out.println(list.get(0));
System.out.println((Object) list.get(1));
输出:
a
1
是的。
Java
Arrays
是同构的,因为当你在Java中声明任何数组时,你必须声明它的type
。
例如:
int arr[]; //type is int
String arr[]; //type is String
float arr[]; //type is float
现在如果您尝试在声明的数组中存储任何其他数据类型,这将是一个编译时错误。 例如:
int arr=new int[5];
arr[0]="I am a String not int"; //compile time error
但是
ArrayList
是Collection
的一部分,它们持有Objects
,而不是任何特定的data-type
[如果我们不是在谈论generics
],并且因为java中的每个东西都是直接或间接继承的来自 Object
class
,所以它不会给你 compile-time error,
类型检查将开启 run-time
。
例如:
ArrayList al=new ArrayList();//type is Object
al.add("I am a String"); //Bacause String class in inherited from Object Class
al.add(1);//the int 1 will first autobox into Integer class then stored in al ArrayList.Now bacause Integer class is also inherited from Object class,it will*/ allow you to store
al.add(UserDefinedClass); //because every User defined class is also inherited from Object class,so it will also allow you.
现在你注意到了吗,因为我们没有定义任何
ArrayList al
的数据类型,但我们仍然存储不同类型的值:这就是为什么ArrayList
存储Object
不是特定的数据类型,因此它们不是异构的同质。
import java.util.ArrayList
class ArrayDemo{
public static void main(String[] args){
// ARRAYS ARE HOMOGENEOUS
int[] arr = new int[2];
arr[0] = 10;
arr[1] = 10.2 // COMPILATION ERROR
// BUT ARRAYLISTS ARE NOT
ArrayList array = new ArrayList();
array.add(Integer.valueOf(10));
array.add(Double.valueOf(10.2)); // NO COMPILATION ERROR
}
}