使用泛型转换数组

use*_*792 5 java arrays generics

以下陈述之间有什么区别:

List<E>[] x = (List<E>[]) new List[100];
Run Code Online (Sandbox Code Playgroud)

List<E>[] x = new List[100];
Run Code Online (Sandbox Code Playgroud)

在我的脚本中,它注意到前者是创建泛型数组的正确方法(尽管它会导致编译器警告).但我无法弄清楚该(List<E>[])陈述的用途是什么.List<E>[]甚至不是它自己的类型,编译器将简单地替换它(List[]),所以你得到

List<E>[] x = (List[]) new List[100];
Run Code Online (Sandbox Code Playgroud)

转换List[]List[],这是无用的.那么为什么要(List<E>[])放在第一位呢?

Dil*_*eep 3

泛型通过在编译时检测到更多错误来增加代码的稳定性。

这是我给出的链接的一部分,认为这很重要,所以我将其发布在这里

这是java.util 包中List 和 Iterator接口定义的一小段摘录:

public interface List <E> {
    void add(E x);
    Iterator<E> iterator();
}

public interface Iterator<E> {
    E next();
    boolean hasNext();
}
Run Code Online (Sandbox Code Playgroud)

除了尖括号中的内容之外,这段代码应该都很熟悉。这些是接口 List 和 Iterator 的形式类型参数的声明。

类型参数可以在整个泛型声明中使用,几乎可以在使用普通类型的地方使用。

我们知道泛型类型声明List的调用,比如 List。在调用(通常称为参数化类型)中,所有出现的形式类型参数(本例中为 E) 都将替换为实际类型参数(本例中为 Integer)。

您可能会认为 List 代表 List 的一个版本,其中 E 已统一替换为 Integer:

public interface IntegerList {
        void add(Integer x);
        Iterator<Integer> iterator();
    }
Run Code Online (Sandbox Code Playgroud)

这种直觉可能会有所帮助,但也会产生误导

这很有帮助,因为参数化类型 List 确实具有与此扩展类似的方法。

这是一种误导,因为泛型的声明实际上从未以这种方式扩展。代码不存在多个副本——源代码中不存在,二进制文件中不存在,磁盘上也不存在,内存中也不存在。

泛型类型声明被一次性编译,并变成单个类文件,就像普通的类或接口声明一样。

类型参数类似于方法或构造函数中使用的普通参数。就像方法具有描述其操作的值类型的形式值参数一样,泛型声明也具有形式类型参数。调用方法时,实际参数将替换形式参数,并对方法体进行求值。

当调用泛型声明时,实际类型参数将替换形式类型参数。这就是泛型的重要性。

您可以在这里查看有关泛型的更多信息