Java数组是同构的,但ArrayList不是,这意味着什么?
2022-09-03 05:11:35
如果我们有一个 Type[],我们只能在其中存储 Type 或其子类型。ArrayList 也是如此。那么,为什么说一个是同质的,而另一个不是呢?
如果我们有一个 Type[],我们只能在其中存储 Type 或其子类型。ArrayList 也是如此。那么,为什么说一个是同质的,而另一个不是呢?
数组对添加的元素的类型进行运行时检查。也就是说,如果添加了类型不同的新元素,则会在运行时引发 ArrayStoreException
。这就是为什么它们被认为是“家常的”。
对于 s(一般而言为 s)则不然。由于在运行时进行类型擦除,它几乎可以容纳任何对象。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));
输出:
一个
1
是的。 是同构的,因为当你在Java中声明任何数组时,你必须声明它的.例如:Java
Arrays
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
但是是 的 一部分,它们持有,而不是任何具体的 [如果我们不谈论 ],并且因为 java 中的每一个东西都是直接或间接地继承自 ,所以它不会给你类型检查会 on 。ArrayList
Collection
Objects
data-type
generics
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