我以为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>
所以很明显我在字节码中有通用信息,那么这擦除的东西是什么?
一些通用类型信息存储在Signature
属性中。请参阅JLS 4.8和4.6以及JVM规范4.3.4。在这里阅读:
关于Java中的泛型,最常见的抱怨可能是它们没有被泛化-无法在运行时知道a
List<String>
与a的不同之处List<Long>
。我已经习惯了这一点,以至于惊讶地发现Neil Gafter在Super Type Tokens方面的工作。事实证明,尽管JVM不会跟踪泛型类实例的实际类型参数,但它会跟踪泛型类的子类的实际类型参数。换句话说,虽然newArrayList<String>()
实际上ArrayList()
在运行时只是一个new ,但是如果一个class扩展了ArrayList<String>
,那么JVM就会知道这String
是的type参数的实际List
类型参数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句