在阅读 Java泛型和集合(O'Reilly)时,我的注意力被下面的段落所吸引
通过擦除实现泛型的另一个结果是,数组类型在关键方面与参数化类型不同。 执行新的String [size]会分配一个数组,并在该数组中存储一个指示其组成部分为String类型的指示。相比之下,执行:new ArrayList()分配一个列表,但不将其元素类型的任何指示存储在列表中。用行话来说,我们说Java可以对数组组件类型进行分类,而不能对列表进行分类。元素类型(或其他通用类型)。
任何人都可以用斜体文本来简短介绍Java如何维护该方案吗?
答案 0 :(得分:1)
执行新的String [size]会分配一个数组,并将指示其成分为
String
类型的指示存储在该数组中。
不,不是。必要时,它首先为元素类型创建一个数组 class ,然后使用指定数量的元素实例化该数组。在Java中,任何数组都是对象,任何对象都包含对其自身类的引用,并且数组类知道其自身的元素类型。它不像“在该数组中存储指示其组件为String
类型的指示”那样简单。
相反,执行
new ArrayList()
会分配一个列表,但不会在列表中存储任何有关其元素类型的指示。
那也不正确。 ArrayList
被指定为具有类型E
的元素,其中E
是无界的,这意味着它在对象代码中已从ArrayList
到java.lang.Object
删除。对于任何给定的实例,未存储的是E
的实际类型。
答案 1 :(得分:0)
它就是它所说的。
String arr = new String [5]表示由5个String元素组成的String数组。如果arr是字符串数组,则无法编译代码arr [3] = 5。
而ArrayList arr = new ArrayList();只是一个指向可能包含任何内容的数组的指针。
这是场景:
public class Main
{
public static void main(String[] args)
{
ArrayList arr = new ArrayList();
// I can add anything to my array
arr.add(5); // I can add an Integer to element 0
arr.add("Hello"); // I can add a String to element 1
arr.add(3.1415936); // I can add a Float to element 2
// and then, before using the array elements, I can test them.
// Example, I test element 0
if(arr.get(0) instanceof String){
System.out.println("Element 0 is String");
}
if(arr.get(0) instanceof Integer){
System.out.println("Element 0 is Integer");
}
}
}
事实证明,在运行时,Element 0 is Integer
。
您可以对其进行测试。如我所描述的那样工作。