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

标签 java generics jvm bytecode type-erasure

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

相关文章:

java - 如何使用java将提问者文档转换为xml格式

java - Proguard 返回错误代码 1。 (com.google.android.gms)

java - 我应该将 Cobertura 的哪些工件 checkin 到 SVN?

generics - 实现多个特征的通用类型

c# - 使用泛型的 WPF View/ViewModels - 如何?

java - JNI : Callback from JVM to C++ fails to run

java - ServiceBus JAVA SDK高级重新加载错误,ServiceLoader(不是子类型)

java - cucumber arity 不匹配 : trying to bind several matching groups to a single stepdef parameter

generics - 在Kotlin中声明具有泛型边界的类属性的正确方法是什么?

java - 同一 JVM 上每个 Java 程序的单独 JVM 属性