Java数组是同构的,但ArrayList不是,这意味着什么?

如果我们有一个 Type[],我们只能在其中存储 Type 或其子类型。ArrayList 也是如此。那么,为什么说一个是同质的,而另一个不是呢?


答案 1

数组对添加的元素的类型进行运行时检查。也就是说,如果添加了类型不同的新元素,则会在运行时引发 ArrayStoreException。这就是为什么它们被认为是“家常的”。

对于 s(一般而言为 s)则不然。由于在运行时进行类型擦除,它几乎可以容纳任何对象。ArrayListList

以下情况在运行时引发异常:

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

通过正确使用泛型,即声明类型而不是上面的变量,在编译时可以避免问题:listArrayList<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));

输出:

一个

1


答案 2

是的。 是同构的,因为当你在Java中声明任何数组时,你必须声明它的.例如:JavaArraystype

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

但是是 的 一部分,它们持有,而不是任何具体的 [如果我们不谈论 ],并且因为 java 中的每一个东西都是直接或间接地继承自 ,所以它不会给你类型检查会 on 。ArrayListCollectionObjectsdata-typegenericsObjectclasscompile-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 alArrayListObject