Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java如何存储类型指示?_Java_Generics - Fatal编程技术网

java如何存储类型指示?

java如何存储类型指示?,java,generics,Java,Generics,在阅读《Java泛型和集合》(O'Reilly)一书时,我的注意力被下面的段落所吸引 通过擦除实现泛型的另一个结果是数组类型在关键方面与参数化类型不同。执行新字符串[size]分配一个数组,并在该数组中存储其组件为字符串类型的指示。相反,executing:new ArrayList()分配一个列表,但不在列表中存储其元素类型的任何指示。用行话来说,我们说Java具体化了数组组件类型,但没有具体化列表元素类型(或其他泛型类型) 有人能用斜体文字介绍一下java是如何维护这个场景的吗?这就是它所说

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

通过擦除实现泛型的另一个结果是数组类型在关键方面与参数化类型不同。执行新字符串[size]分配一个数组,并在该数组中存储其组件为字符串类型的指示。相反,executing:new ArrayList()分配一个列表,但不在列表中存储其元素类型的任何指示。用行话来说,我们说Java具体化了数组组件类型,但没有具体化列表元素类型(或其他泛型类型)


有人能用斜体文字介绍一下java是如何维护这个场景的吗?

这就是它所说的

String arr=新字符串[5]表示由5个字符串元素组成的字符串数组。如果arr是字符串数组,则无法编译代码arr[3]=5

而ArrayList arr=新的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");
    }

    }
}
事实证明,在运行时,
元素0是整数

你可以测试一下。正如我所描述的那样

执行新字符串[size]分配一个数组,并在该数组中存储一个指示,表明其组件属于
String
类型

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

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


这也不正确
ArrayList
被指定为具有
E
类型的元素,其中
E
是无界的,这意味着它在
ArrayList
java.lang.object
的对象代码中被擦除。没有存储的是任何给定实例的
E
的实际类型

这段话似乎措词不当。数组和容器是完全不同的概念。然而,这个问题在这里几乎是离题的。请访问并阅读以了解如何使用此网站。您询问的是
擦除
。过去很多人都在谈论这个话题。此问题可能是其中一个或多个问题的重复,此处没有错误。你的观点是什么?