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>[])放在第一位呢?
泛型通过在编译时检测到更多错误来增加代码的稳定性。
这是我给出的链接的一部分,认为这很重要,所以我将其发布在这里
这是java.util 包中List 和 Iterator接口定义的一小段摘录:
Run Code Online (Sandbox Code Playgroud)public interface List <E> { void add(E x); Iterator<E> iterator(); } public interface Iterator<E> { E next(); boolean hasNext(); }除了尖括号中的内容之外,这段代码应该都很熟悉。这些是接口 List 和 Iterator 的形式类型参数的声明。
类型参数可以在整个泛型声明中使用,几乎可以在使用普通类型的地方使用。
我们知道泛型类型声明List的调用,比如 List。在调用(通常称为参数化类型)中,所有出现的形式类型参数(本例中为 E) 都将替换为实际类型参数(本例中为 Integer)。
您可能会认为 List 代表 List 的一个版本,其中 E 已统一替换为 Integer:
Run Code Online (Sandbox Code Playgroud)public interface IntegerList { void add(Integer x); Iterator<Integer> iterator(); }这种直觉可能会有所帮助,但也会产生误导。
这很有帮助,因为参数化类型 List 确实具有与此扩展类似的方法。
这是一种误导,因为泛型的声明实际上从未以这种方式扩展。代码不存在多个副本——源代码中不存在,二进制文件中不存在,磁盘上也不存在,内存中也不存在。
泛型类型声明被一次性编译,并变成单个类文件,就像普通的类或接口声明一样。
类型参数类似于方法或构造函数中使用的普通参数。就像方法具有描述其操作的值类型的形式值参数一样,泛型声明也具有形式类型参数。调用方法时,实际参数将替换形式参数,并对方法体进行求值。
当调用泛型声明时,实际类型参数将替换形式类型参数。这就是泛型的重要性。
您可以在这里查看有关泛型的更多信息
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |