Java类型擦除会擦除我的通用类型吗?

Morteza Adi:

我以为Java擦除会在编译时消除泛型类型,但是当我自己对其进行测试时,我意识到在Bytecode中有一些有关泛型类型的信息。

这是我的测试:

我写了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>

所以很明显我在字节码中有通用信息,那么这擦除的东西是什么?

NINCOMPOOP:

一些通用类型信息存储在Signature属性中。请参阅JLS 4.84.6以及JVM规范4.3.4在这里阅读

关于Java中的泛型,最常见的抱怨可能是它们没有被泛化-无法在运行时知道a List<String>与a的不同之处List<Long>我已经习惯了这一点,以至于惊讶地发现Neil Gafter在Super Type Tokens方面的工作。事实证明,尽管JVM不会跟踪泛型类实例的实际类型参数,但它会跟踪泛型类的子类的实际类型参数。换句话说,虽然new ArrayList<String>()实际上ArrayList()在运行时只是一个new ,但是如果一个class扩展了ArrayList<String>,那么JVM就会知道这String是的type参数的实际List类型参数。

以及Neal Gafter的博客

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章