gpt4 book ai didi

java - Java 类型删除会删除我的泛型类型吗?

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:24 25 4
gpt4 key购买 nike

我以为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com