当前位置: 首页 > 面试题库 >

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

冯宏恺
2023-03-14
问题内容

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


问题答案:

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

对于ArrayLists(List通常是s)而言,情况并非如此。由于在运行时进行类型擦除,因此它实际上可以容纳任何对象。

运行时,以下内容引发异常:

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

通过正确使用泛型,即在listtype之上声明变量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个



 类似资料:
  • 我想创建一个

  • 看着新的Azure cosmos数据库,我对它的多模型特性有点困惑。具体而言,这是否意味着: a)相同的底层数据库/存储可以以多种方式并发查询,以便我可以对相同的集合使用gremlin图查询和mongodb api。 或 b)这是否意味着您可以在预配Cosmos DB时选择不同的模型(图、键值、列、文档),这就是从那时起存储数据的方式。 小册子让它听起来像a),但使用Azure仪表板创建cosmo

  • Java宣布一个集合为最终集合意味着什么?是不能再添加更多元素了吗?是已经存在的元素不能更改吗?是别的什么吗?

  • 我刚刚浏览了一些代码,我看到了以下方法

  • 问题内容: 据说Javascript的主要优点之一是它是一种基于原型的语言。 但是,Javascript是基于原型的,这意味着什么?为什么这是优点? 问题答案: 原型继承 是一种面向对象的 代码重用形式 。Javascript是使用原型继承的仅有的[主流]面向对象语言之一。几乎所有其他面向对象的语言都是经典的。 在 经典继承中 ,程序员编写一个类,该类定义一个对象。可以从同一类中实例化多个对象,因