java如何存储类型指示?

时间:2018-06-30 03:05:50

标签: java generics

在阅读 Java泛型和集合(O'Reilly)时,我的注意力被下面的段落所吸引

  

通过擦除实现泛型的另一个结果是,数组类型在关键方面与参数化类型不同。 执行新的String [size]会分配一个数组,并在该数组中存储一个指示其组成部分为String类型的指示。相比之下,执行:new ArrayList()分配一个列表,但不将其元素类型的任何指示存储在列表中。用行话来说,我们说Java可以对数组组件类型进行分类,而不能对列表进行分类。元素类型(或其他通用类型)。

任何人都可以用斜体文本来简短介绍Java如何维护该方案吗?

2 个答案:

答案 0 :(得分:1)

  

执行新的String [size]会分配一个数组,并将指示其成分为String类型的指示存储在该数组中。

不,不是。必要时,它首先为元素类型创建一个数组 class ,然后使用指定数量的元素实例化该数组。在Java中,任何数组都是对象,任何对象都包含对其自身类的引用,并且数组类知道其自身的元素类型。它不像“在该数组中存储指示其组件为String类型的指示”那样简单。

  

相反,执行new ArrayList()会分配一个列表,但不会在列表中存储任何有关其元素类型的指示。

那也不正确。 ArrayList被指定为具有类型E的元素,其中E是无界的,这意味着它在对象代码中已从ArrayListjava.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

您可以对其进行测试。如我所描述的那样工作。