background image

  看到标号为 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 会为不同的泛型类型生成不同的具体类型代码,这在我之前的文章中也有所提及。