泛型是将类型参数化,允许定义在类、接口、方法时使用类型参数,当使用的时候指定具体类型。泛型主要应用在集合

泛型的优点

  1. 代码需要更精简
  2. 程序更加健壮
  3. 编码期,可读性很高

泛型的上下限

上限

格式:类型名称 <? extend 类> 对象名称
说明:只能接收该类型及其子类

下限

格式:类型名称 <? super 类> 对象名称
说明:只能接收该类型及其父类型

类型擦除和桥接方法

泛型是给javac编译器使用,在编译器编译之后的class文件中是没有泛型信息的,所以泛型的使用不会让程序运行效率收到影响,这个过程称之为擦除。
由于类型擦除了,为了维持多态性,需要一些桥接方法类保持多态性,桥接方法是编译器自动生成

// 最初的代码
public class Node<T> {public T data;public void setData(T data) {this.data = data;}
}
public class MyNode extends Node<Integer> {public void setData(Integer data) {....}
}

编译器编译之后的代码(类型已擦除,并增加了桥接方法)

// jvm不认识泛型的,把泛型擦除掉, 兼容⽼版本jdk
public class Node {public Object data;public void setData(Object data) {this.data = data;}
}public class MyNode extends Node {// 桥接⽅法,编译器⾃动⽣成public void setData(Object data) {setData((Integer)data)}public void setData(Integer data) {....}
}

泛型之类型擦除和桥接方法相关推荐

  1. 泛型中的类型擦除和桥方法

    在Java中,泛型的引入是为了在编译时提供强类型检查和支持泛型编程.为了实现泛型,Java编译器应用类型擦除实现: 1.  用类型参数(type parameters)的限定(如果没有就用Object ...

  2. java 泛型和类型擦除_关于Java泛型和擦除

    java 泛型和类型擦除 "编译期间擦除泛型"是常识(好吧,类型参数和实参实际上是被擦除的). 这是由于"类型擦除"而发生的. 但这是错误的,正如许多开发人员所 ...

  3. 描述java泛型引入原则_Java/泛型的类型擦除/README.md · oslo/LearningNotes - Gitee.com

    前言 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下 ...

  4. Java泛型:类型擦除

    前情回顾 Java泛型:泛型类.泛型接口和泛型方法 类型擦除 代码片段一 1 2 3 4 5 6 7 Class c1 = new ArrayList<Integer>().getClas ...

  5. java object toarray_java从toArray返回Object[]到泛型的类型擦除

    在将ArrayList等Collection转为数组时,函数的返回值并不是泛型类型的数组,而是Object[].刚好最近翻了一遍<java核心技术>,以及参考<Think in Ja ...

  6. Java泛型的类型擦除

    写在前面:最近在看泛型,研究泛型的过程中,发现了一个比较令我意外的情况,Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节代码中是不包含泛型中的类型信息的.使用泛型的时候加上的类 ...

  7. Java基础篇:泛型与类型擦除

    一.什么是泛型: 泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也 ...

  8. java 泛型 擦除_Java泛型和类型擦除

    一 前言:初识泛型 废话不说,先来看一段代码: public class Holder { private Object data; public Holder(Object data ){ this ...

  9. 数学与泛型编程:高效编程的奥秘pdf_Java 泛型与类型擦除

    UCB 19Fall学期 CS61B Prof. Hilfinger讲泛型部分的PPT: http://www-inst.eecs.berkeley.edu/~cs61b/fa19/materials ...

最新文章

  1. Nat Commun:宏基因组学提示曙古菌门的代谢和进化(中大李文均组)
  2. office365加速解决方案
  3. 中国移动2016年Web应用防火墙集采:绿盟、深信服中标
  4. 浅拷贝和深拷贝的区别_深拷贝和浅拷贝的区别
  5. 水晶报表的统计功能-Crystal Report Sub total Per Page
  6. Taro+react开发(28)本地用require线上不必
  7. linux mysql5.6.30 配置_Linux(Red Hat 6 32位) 下安装Mysql5.6.30
  8. TCP/IP协议栈:TCP超时重传机制
  9. 单片机4层电梯设计c语言,详解基于单片机的四层电梯控制系统的设计与实现,Proteus仿真和程序代码...
  10. This iPhone 6s is running iOS 11.3.1 (15E302), which may not be supported by this version of Xcode.
  11. Unity 边缘发光HighlightingSystem的使用
  12. STM32F205时钟配置
  13. mac flutter开发环境 flutter环境变量的配置
  14. 联想启天 M7150 刷 bios 方法_七夕小子_新浪博客
  15. python怎么取百位_#python计算结果百位500向下取整,(0-499取000,500-999取500)
  16. java maincase 电影票的售卖与购买 day10-11
  17. 华为认证专用模拟器 企业内部业务网络设计
  18. 一节前端课:html+css+js做个计算器
  19. 黑马程序员MySQL视频操作代码-P79
  20. Android Studio挂载第三方模拟器

热门文章

  1. oracle 转 mysql 乱码问题吗_Oracle数据传输MySQL中文编码问题
  2. window.btoa()方法;使字符编码成base64的形式
  3. Spring分页实现PageImplT类
  4. 数据库备份和恢复秩序的关系(周围环境:Microsoft SQL Server 2008 R2)
  5. 支付宝当前最新版集成2.1.2版本
  6. 我的第一个wp8小程序
  7. 关于Android中Intent传递Serialzilable数据的问题
  8. Sublime Text 2 备忘录(phper)
  9. C#中怎么判断一个数组中是否存在某个数组值
  10. html标签企业级命名规范