`
annan211
  • 浏览: 445651 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 语法糖 分析(一,泛型与类型擦除)

    博客分类:
  • jvm
 
阅读更多
  语法糖是一种计算机术语,是为了更加方便理解计算机语言或者说更便于编程而存在的,对编码的功能没有影响。
   严格来说,几乎所有的人类编码,都算是语法糖的体现,只有计算机指令除外。
   但是本文为了更好理解语法糖,站的角度略微不同。

   在Java语言里,类型转换是无法预期的,有些时候 在编译期 编译器并不知道此类型转换能否成功,许多的转换异常 ClassCastException 就会被转嫁到运行期之中。
   Java中的泛型支持只存在源码之中,在编译器之后生成的字节码文件中就会被转换为原生类型,并且插入强制类型转换。对于运行期间的java代码来说 ,List<Integer> 和 List<String> 是一个类,他们都被转换成了List ,所以说 泛型是Java语言的一颗语法糖。java 语言中的泛型实现是基于类型擦除,基于类型擦除的泛型是伪泛型。
  
 
   public class GenericTest {

	public static void method(List<String> list){

	}

	public static void method(List<Integer> list){

	}

}
  


上面这段代码在编译期间就会报错
Method method(List<Integer>) has the same erasure method(List<E>) as another method in type GenericTest


有些筒子会认为这是Java的 方法重载,为什么会编译不通过。 按照上面的分析,编译器会忽略 泛型参数,两个方法都会被编译为

public static void method(List list){

	}


由于方法签名一模一样,编译器自然会不允许。

但是如果我们换一种方式

  class GenericTest2{
	public static int method(List<String> list){

		return 1;
	}

	public static void method(List<Integer> list){

	}
}


会发现 编译器会允许编译,执行也没有任何问题。

这又会挑战我们的另一个认知: Java方法的重载是不会考虑返回值的。

事实上 Java 的重载机制 确实是不会考虑方法的返回值的。
之所以 编译器允许通过 ,是因为 这两个方法 使用不同的返回值 使得他们可以共存于一个class文件里。 Java的 重载机制,只会涉及 方法名和参数列表,返回值是不参与重载选择的。
  Java 规范中 规定,只要描述不是完全一致的方法 ,是可以共存在一个class 文件里的。

以上解除异常的方案是毫无优雅可言的,我们可以得出,这里语法糖的所谓擦除,仅仅是对 code属性的字节码进行擦除,实际上元数据还是保留了泛型信息,我们可以通过反射抓取。
分享到:
评论

相关推荐

    Java-Edge#Java-Interview-Tutorial#Java语法糖之泛型与类型擦除1

    - 泛型擦除前的例子把这段Java代码编译成Class文件,然后再用字节码反编译后,將会发现泛型都不见了,又变回了Java泛型出现之前的写法,泛型类型都变回了原

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    本代码资源是一个关于Java语言中泛型的讲解案例代码。通过使用实际的示例代码,详细讲解了泛型的定义、用法和优势。 适用人群: 有一定Java编程基础的开发者;对泛型概念感兴趣或希望加深理解的学习者。 使用场景...

    【java核心技术】泛型设计

    目录一、泛型概述二、泛型定义(1)泛型类(2)泛型方法2.1 泛型可变参数(3)泛型接口(4)类型限定三、泛型使用(1)类型通配符1.1 上限1.2 下限四、泛型擦除五、泛型数组 一、泛型概述 泛型,即是参数化类型。在...

    Java基础:泛型及其擦除性、不可协变性

     在Java SE1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。...

    Java中高级核心知识全面解析(精华必看)

    一、Java (一). 基础 1.Java 基本功 1.1.Java 入门(基础概念与常识) 1.1.1.Java 语言有哪些特点? 1.1.2.关于 JVM JDK 和 JRE 最详细通俗的解答 ...什么是类型擦除?介绍一下常用的通配符? ......

    Java数据结构入门基础

    文章目录 泛型概念 泛型语法 泛型的使用 泛型的擦除机制 泛型的上界 泛型方法 通配符 泛型概念 泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化 一般的类和方法,只能使用具体的类型:

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 259 10.2.2 解析与填充符号表 / 262 10.2.3 注解处理器 / 264 10.2.4 语义分析与字节码生成 / 264 10.3 Java语法糖的味道 / 268 10.3.1 泛型与类型擦除 / 268 10.3.2 自动装箱、拆箱与遍历循环 / 273 10.3.3...

    Java虚拟机

    10.3.1 泛型与类型擦除 10.3.2 自动装箱、拆箱与遍历循环 10.3.3 条件编译 10.4 实战:插入式注解处理器 10.4.1 实战目标 10.4.2 代码实现 10.4.3 运行与测试 10.4.4 其他应用案例 10.5 本章小结 第11章 ...

    Java2核心技术.part5

    13.9. 2虚拟机中的泛型类型信息 附录AJava关键字 附录B更新的JDK 5.0代码 Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 ...

    疯狂JAVA讲义

    1.5 第一个Java程序 12 1.5.1 编辑Java源代码 12 1.5.2 编译Java程序 13 学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不...

    面试day1-基础.docx

    这份面试题集涵盖了Java面试中常见的一些问题,从多继承的原因到equals方法的区别,再到包装类的应用场景和类型擦除的概念,覆盖了Java语言中的多个重要方面。这些问题不仅考察了基本的语法知识,还涉及到Java的特性...

    Java2核心技术.part3

    13.9. 2虚拟机中的泛型类型信息 附录AJava关键字 附录B更新的JDK 5.0代码 Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 ...

    Java2核心技术.part1

    13.9. 2虚拟机中的泛型类型信息 附录AJava关键字 附录B更新的JDK 5.0代码 Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 同步 1.6 ...

    Java2核心技术.part6

    13.9. 2虚拟机中的泛型类型信息 附录AJava关键字 附录B更新的JDK 5.0代码 Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 ...

    Java2核心技术.part4

    13.9. 2虚拟机中的泛型类型信息 附录AJava关键字 附录B更新的JDK 5.0代码 Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 ...

    Java2核心技术.part2

    13.9. 2虚拟机中的泛型类型信息 附录AJava关键字 附录B更新的JDK 5.0代码 Java2核心技术II卷.高级特性 目录: 译者序 前言 第1章 多线程 1.1 什么是线程 1.2 中断线程 1.3 线程状态 1.4 线程属性 1.5 ...

    java笔试题算法-Thinking-in-Java:《ThinkingInjava》-Note《Java编程思想》笔记作者:[美]Bruce

    这本书不会一味地讲语法,更多的是会讲一些Java的设计思想,比如他不会一开始就教你怎么用泛型,而是先介绍为什么会出现泛型,没有泛型会有什么后果,Java设计者又为什么会选择泛型的擦除,书中对是否选择泛型的擦除...

    javaSE代码实例

    第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...

Global site tag (gtag.js) - Google Analytics