技术开发 频道

浅谈Java语言的Type Erasure特性

  从bytecode中可以看出,其中并没有包含任何与K,V有关的信息。get/put方法的参数和返回值都是Object类型,甚至内置的HashMap也是如此。那么调用DictWrapper的代码是如何做到“强类型”的呢?例如:

浅谈Java语言的Type Erasure特性

  它的bytecode便是:

浅谈Java语言的Type Erasure特性

  看到标号为22的那行代码没有?这条checkcast指令便是将上一句invokevirtual的结果转化为String类型——DictWrapper.get所返回的是个最普通不过的Object。

  这便是Java语言的泛型实现——请注意我这里说的是Java语言,而不是JVM。因为JVM本身并没有“泛型”的概念,Java语言的泛型则完全是编译器的魔法。我们写出的泛型代码,事实上都是和Object对象在打交道,是编译器在帮我们省去了冗余的类型转换代码,以此保证了代码层面的类型安全。由于在运行时去除所有泛型的类型信息,因此这种泛型实现方式叫做Type Erasure(类型擦除)。

  在.NET中则完全不同,“泛型”是真真切切落实在CLR层面上的功能。例如DictWrapper.Get方法在.NET上的IL代码便是:

浅谈Java语言的Type Erasure特性

0
相关文章