看到标号为 22 的那行代码没有?这条 checkcast 指令便是将上一句 invokevirtual 的结果
转化为 String
——
类型
DictWrapper.get 所返回的是个最普通不过的 Object。
这便是 Java
——
语言的泛型实现
请注意我这里说的是 Java 语言,而不是 JVM。因为
JVM
“
”
本身并没有 泛型 的概念,Java
语言的泛型则完全是编 译器的魔法。我们写出的泛
型代码,事实上都是和 Object 对象在打交道,是编译器在帮我们省去了冗余的类型转换
代码,以此保证了代码层面的类型安全。由 于在运行时去除所有泛型的类型信息,因此
这种泛型实现方式叫做 Type Erasure(类型擦除)。
在 .NET
“
”
中 则 完 全 不 同 , 泛 型 是 真 真 切 切 落 实 在 CLR 层 面 上 的 功 能 。 例 如
DictWrapper.Get 方法在.NET 上的 IL 代码便是:
您可以发现,.NET 的 IL 便确切包含了 TKey 和 TValue 的类型信息。而在运行的时候,
CLR 会为不同的泛型类型生成不同的具体类型代码,这在我之前的文章中也有所提及。