类型擦除

142 阅读1分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。 java源代码-》编译器-》jvm可执行的字节码文件-》jvm-》解释器-》机器码-》程序运行

类型擦除

泛型是java1.5版本才引进的概念,在这之前是没有泛型的,但是泛型代码能够很好的和之前版本的代码兼容。是因为泛型信息只中代码编译阶段,泛型是一个编译时的概念。在进入jvm之前,与泛型相关的信息会被擦除。这是由于Java的泛型是使用擦除来实现的,意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。由于有了擦除,Java编译器无法将manipulate()必须能够在obj上调用f()这一需求映射到HasF拥有f()这一事实上。

无限制类型擦除

在这种类型类型擦除时。会用Object类型代替泛型。

截屏2022-02-25 下午4.53.38

有限制的类型擦除

在这种类型类型擦除是会使用上限类型擦除。截屏2022-02-25 下午4.59.39

桥接方法

在接口中使用泛型,在实现类型擦除的时候会出现桥接方法。目的是为了保证接口和类的实现关系。

截屏2022-02-25 下午5.08.05

查看类型擦除

Field[] fs = generic.getClass().getDeclaredFields();
for (Field f : fs) {
    System.out.println("type: " + f.getType().getName()); // type: java.lang.Object
}

我们可以利用反射来查看类型擦除后的变量的数据类型。getDeclaredFields是反射中的方法,可以获取当前类已经声明的各种字段,包括public,protected以及private。