当您在不指定对象类型的情况下创建 ArrayList 时,它会在您添加第一个对象时自动创建它吗?

Posted

技术标签:

【中文标题】当您在不指定对象类型的情况下创建 ArrayList 时,它会在您添加第一个对象时自动创建它吗?【英文标题】:When you make an ArrayList without specifying the object type, does it create it automatically when you add the first object? 【发布时间】:2011-04-25 14:14:03 【问题描述】:

例如,而不是做

ArrayList<ClassName> variableName;

你会的

ArrayList variableName;

然后你添加一个“ClassName”类型的对象

variableName.add(objectName);

会自动将你的数组类型设置为

ArrayList<ClassName>

?

【问题讨论】:

见download.oracle.com/javase/tutorial/java/generics/generics.html和download.oracle.com/javase/tutorial/java/generics/erasure.html 【参考方案1】:

没有。泛型仅用于编译时。您只是失去了该检查的好处。在运行时,所有通用信息都会被删除

换句话说,

ArrayList<Type> 

在运行时只是一个 ArrayList。对 List 这样做的好处是,当您编写代码时,编译器会检查您没有在列表中放入任何不合适的内容。

【讨论】:

【参考方案2】:

如果不指定,则与指定 ArrayList 相同,表示可以将任何类型的对象添加到 ArrayList。指定类时执行的类型检查发生在编译时,而不是运行时,因此事情不可能按照您建议的方式工作(让它们在运行时确定更具体的类)。

【讨论】:

我会说语义上 ArrayList 的意思是“这个列表可能包含任何类型的对象”,而 ArrayList 的意思是“这要么是遗留代码,要么我没有费心指定它的类型列表的元素到编译器”。 ninjalj:那你会怎么称呼 ArrayList> ?我会称之为“这个列表包含可能任何类型的对象”,而 ArrayList 将是“这个包含对象”..【参考方案3】:

真正的类型真的是ArrayListArrayList&lt;ClassName&gt; 类型只存在于编译器(这称为擦除),其目的是在编译器级别提供类型安全。但是在字节码级别,您没有泛型类型的知识。

【讨论】:

以上是关于当您在不指定对象类型的情况下创建 ArrayList 时,它会在您添加第一个对象时自动创建它吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不下载 Java 的情况下获取网站图像的尺寸?

C++ 11 创建和使用共享 weak_ptr

如何在不创建临时对象的情况下迭代嵌套的 TreeMap

如何在不将 nib 名称指定为字符串的情况下使用 nib 加载 View Controller 子类?

如何在不限制其维度的情况下为函数参数指定类型?

如何在不知道列类型的情况下获取列的值