泛型之类型擦除和桥接方法
泛型是将类型参数化,允许定义在类、接口、方法时使用类型参数,当使用的时候指定具体类型。泛型主要应用在集合
泛型的优点
- 代码需要更精简
- 程序更加健壮
- 编码期,可读性很高
泛型的上下限
上限
格式:类型名称 <? 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) {....}
}
泛型之类型擦除和桥接方法相关推荐
- 泛型中的类型擦除和桥方法
在Java中,泛型的引入是为了在编译时提供强类型检查和支持泛型编程.为了实现泛型,Java编译器应用类型擦除实现: 1. 用类型参数(type parameters)的限定(如果没有就用Object ...
- java 泛型和类型擦除_关于Java泛型和擦除
java 泛型和类型擦除 "编译期间擦除泛型"是常识(好吧,类型参数和实参实际上是被擦除的). 这是由于"类型擦除"而发生的. 但这是错误的,正如许多开发人员所 ...
- 描述java泛型引入原则_Java/泛型的类型擦除/README.md · oslo/LearningNotes - Gitee.com
前言 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下 ...
- Java泛型:类型擦除
前情回顾 Java泛型:泛型类.泛型接口和泛型方法 类型擦除 代码片段一 1 2 3 4 5 6 7 Class c1 = new ArrayList<Integer>().getClas ...
- java object toarray_java从toArray返回Object[]到泛型的类型擦除
在将ArrayList等Collection转为数组时,函数的返回值并不是泛型类型的数组,而是Object[].刚好最近翻了一遍<java核心技术>,以及参考<Think in Ja ...
- Java泛型的类型擦除
写在前面:最近在看泛型,研究泛型的过程中,发现了一个比较令我意外的情况,Java中的泛型基本上都是在编译器这个层次来实现的.在生成的Java字节代码中是不包含泛型中的类型信息的.使用泛型的时候加上的类 ...
- Java基础篇:泛型与类型擦除
一.什么是泛型: 泛型的本质是 参数化类型,也就是说 将所操作的数据类型 指定为一个参数,在不创建新类的情况下,通过参数来指定所要操作的具体类型(类似于方法中的变量参数,此时类型也定义成参数形式),也 ...
- java 泛型 擦除_Java泛型和类型擦除
一 前言:初识泛型 废话不说,先来看一段代码: public class Holder { private Object data; public Holder(Object data ){ this ...
- 数学与泛型编程:高效编程的奥秘pdf_Java 泛型与类型擦除
UCB 19Fall学期 CS61B Prof. Hilfinger讲泛型部分的PPT: http://www-inst.eecs.berkeley.edu/~cs61b/fa19/materials ...
最新文章
- Nat Commun:宏基因组学提示曙古菌门的代谢和进化(中大李文均组)
- office365加速解决方案
- 中国移动2016年Web应用防火墙集采:绿盟、深信服中标
- 浅拷贝和深拷贝的区别_深拷贝和浅拷贝的区别
- 水晶报表的统计功能-Crystal Report Sub total Per Page
- Taro+react开发(28)本地用require线上不必
- linux mysql5.6.30 配置_Linux(Red Hat 6 32位) 下安装Mysql5.6.30
- TCP/IP协议栈:TCP超时重传机制
- 单片机4层电梯设计c语言,详解基于单片机的四层电梯控制系统的设计与实现,Proteus仿真和程序代码...
- This iPhone 6s is running iOS 11.3.1 (15E302), which may not be supported by this version of Xcode.
- Unity 边缘发光HighlightingSystem的使用
- STM32F205时钟配置
- mac flutter开发环境 flutter环境变量的配置
- 联想启天 M7150 刷 bios 方法_七夕小子_新浪博客
- python怎么取百位_#python计算结果百位500向下取整,(0-499取000,500-999取500)
- java maincase 电影票的售卖与购买 day10-11
- 华为认证专用模拟器 企业内部业务网络设计
- 一节前端课:html+css+js做个计算器
- 黑马程序员MySQL视频操作代码-P79
- Android Studio挂载第三方模拟器
热门文章
- oracle 转 mysql 乱码问题吗_Oracle数据传输MySQL中文编码问题
- window.btoa()方法;使字符编码成base64的形式
- Spring分页实现PageImplT类
- 数据库备份和恢复秩序的关系(周围环境:Microsoft SQL Server 2008 R2)
- 支付宝当前最新版集成2.1.2版本
- 我的第一个wp8小程序
- 关于Android中Intent传递Serialzilable数据的问题
- Sublime Text 2 备忘录(phper)
- C#中怎么判断一个数组中是否存在某个数组值
- html标签企业级命名规范