我以为 java 删除会在编译时清除泛型类型,但是当我自己测试它时,我意识到字节码中有一些关于泛型类型的信息。
这是我的测试:
我写了 2 个类:
import java.util.*;
public class Test {
List integerList;
}
和
import java.util.*;
public class Test {
List<Integer> integerList;
}
我编译了这两个类,在通用类的某处我看到了这一行
integerList{blah blah}Ljava/util/List;{blah blah}
Signature{blah blah}%Ljava/util/List<Ljava/lang/Integer;>;{blah blah}<init>
在非通用类中:
integerList{blah blah}Ljava/util/List;{blah blah}<init>
显然我在字节码中有通用信息,那么这个删除是什么东西??
最佳答案
what is this erasure thing ??
Erasure 是从通用类型到原始类型的映射。俗话说“因为删除”,本质上是没有意义的。重要的是使用映射的规范。
有两个有趣的用途。
它用于将方法签名从使用泛型映射到原始类型。它是用于重载的原始类型签名。这导致了绝大多数“删除”问题。例如,你不能有两种方法
add(List<String>)
和add(List<Integer>)
在同一类型。重载可能不是一个好主意,而且添加此功能的意愿也不高。对象实例在运行时可用的类型是创建它时删除的类型。因此,如果您转换为
(String)
这将在运行时检查,但如果您转换为List<String>
只会检查该类型 (List
) 的删除。您可以拥有List<String>
类型的变量和List<Integer>
指向完全相同的实例。实际上,您不应在 1.5 及更高版本中使用(引用类型的)强制转换。
在可行的情况下,通用信息保存在类文件中并通过反射提供。所以你会在类定义、父类(super class)型、字段、方法、构造函数等中找到它。
关于java - Java 类型删除会删除我的泛型类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447781/