泛型与容器连载(一)泛型的基本概念和原理
基本概念和原理
“泛型”的字面意思就是广泛的类型。接口和方法代码可以应用于广泛的类型,代码与他们能够操作的数据不在绑定在一起,同一套代码可以用于多种数据类型,这样不仅可以复用代码,降低耦合,而且可以提高代码的可读性和安全性。
这样的文字描述还是很抽象的,下面我们通过一些例子逐步进行说明。在Java中类、接口、方法都可以是泛型,我们先来看泛型类。
1.简单的泛型类
package com.wang.generic;/*** 泛型类型的Person* @author wangzg** @param <T>* @param <U>*/
public class Person<T,U> {private T attr1;private U attr2;public Person(T attr1,U attr2) {this.attr1 = attr1;this.attr2 = attr2;}public T getAttr1() {return attr1;}public void setAttr1(T attr1) {this.attr1 = attr1;}public U getAttr2() {return attr2;}public void setAttr2(U attr2) {this.attr2 = attr2;}}
复制代码
Person就是一个泛型类,与普通类的区别体现在:
1.类名后面多了两个<T,U>;
2.attr1类型为T,attr2类型为U。
T,U表示类型参数,泛型就是类型参数化,处理的数据类型不是固定的,而是可以作为参数传入,具体的用法如下:
Person<String,Integer> person = new Person<>("老妹",25);
System.out.println("attr1:"+ person.getAttr1());
System.out.println("attr1.type:"+ person.getAttr1().getClass());
System.out.println("attr2:"+ person.getAttr2());
System.out.println("attr2.type:"+ person.getAttr2().getClass());
System.out.println("------- end testPersonClass---------");复制代码
2.基本原理
泛型类型参数到底是什么呢?为什么一定要定义类型参数呢?定义不同类型,直接使用Object不就行了吗?比如:
package com.wang.generic;//原型转换后的Person类
class PersonConversion{Object attr1;Object attr2;public PersonConversion(Object attr1,Object attr2) {this.attr1 = attr1;this.attr2 = attr2;}public Object getAttr1() {return attr1;}public void setAttr1(Object attr1) {this.attr1 = attr1;}public Object getAttr2() {return attr2;}public void setAttr2(Object attr2) {this.attr2 = attr2;}}复制代码
使用PersonConversion的代码如下:
PersonConversion person = new PersonConversion("老妹",25);
System.out.println("attr1:"+ person.getAttr1());
System.out.println("attr1.type:"+ person.getAttr1().getClass());
System.out.println("attr2:"+ person.getAttr2());
System.out.println("attr2.type:"+ person.getAttr2().getClass());
System.out.println("-------end testPersonConversion---------");复制代码
实际上Java泛型的内部原理就是这样的。
详细一点来说是这样的,Java编译器将Java源文件转换为.class文件,虚拟机加载并运行.class文件。对于泛型类,Java编译器会将泛型代码转换为不同的非泛型代码,就像上面的PersonConversion类代替Person的一样,将类型参数T,U擦除,替换为Object,插入必要的强制类型转换。Java虚拟机实际执行的时候,它是不知道泛型这回事的,只知道不同的类及代码。
再更具体的来说,Java泛型是通过擦除实现的,类定义中的类型参数T,U等会被替换为Object,再程序运行过程中,不知道泛型的实际类型参数,比如Person<String,Integer>,运行中只知道Person,而不知道<String,Integer>。
Java为什么要这样设计?泛型是Java5以后才支持的,这样设计是为了兼容性不得已的一个选择。
3.泛型的好处
泛型主要有两个好处:
更好的安全性。
更好的可读性。
Java这门语言注重类型的安全性,通过使用泛型,开发环境和编译器能确保不会用错类型,为程序多设置一道安全防护网。使用泛型,还可以省去繁琐的强制类型转换,再加上明确的类型信息。代码可读性会更好。
泛型与容器连载(一)泛型的基本概念和原理相关推荐
- java object转泛型_为什么Java的泛型要用擦除实现
在 Java 中的 泛型 ,常常被称之为 伪泛型 ,究其原因是因为在实际代码的运行中,将实际类型参数的信息擦除掉了 (Type Erasure) .那是什么原因导致了 Java 做出这种妥协的呢?下面 ...
- java 7 泛型_Java(7)泛型
目录 一.泛型概述 1.什么是泛型 2.为什么用泛型 3.在集合中使用泛型 二.自定义泛型结构 1.泛型类.接口 2.泛型方法 三.举例泛型类和泛型方法的使用场景 1.泛型类举例: 2.泛型方法举例 ...
- java 集合与泛型_java的集合和泛型的知识点归纳1
[Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 [ ] 能够说出集合与数组的区别 [ ] 说出Collection集合的常用功能 [ ] 能够使 ...
- 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较
1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...
- 泛型java 代码讲解_Java泛型详解
2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...
- java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题
原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- 什么是泛型,为什么要使用泛型? 泛型类和泛型方法的实现以及限定通配符的使用。什么是泛型擦除,为什么有泛型擦除,泛型擦除到底是怎么实现的
1. 泛型的定义和意义 1.1 什么叫泛型? 泛型,顾名思义就是广泛的类型,专业术语为"参数化类型":当我们创建对象时没指定类型,任何引用类型都可以使用,兼容多种数据类型.如果是基 ...
- java泛型 例子_关于 Java 泛型的一些有趣的例子
有以下的代码: 1 try{2 ArrayList lstA = new ArrayList();3 ArrayList lstB = new ArrayList();4 5 //ArrayList ...
- java中的泛型是什么_Java中泛型是什么?Java泛型的详细介绍
本篇文章给大家带来的内容是关于Java中泛型是什么?Java泛型的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.什么是泛型? Java泛型设计原则:只要在编译时期没有出 ...
最新文章
- python【力扣LeetCode算法题库】322-零钱兑换(动态规划)
- 修改haproxy配置文件
- mysql grou平by_MySQL group by对单字分组序和多字段分组的方法讲解
- go 获得 mysql 实际运行 SQL,Golang实践录:一个数据库迁移的代码记录
- aswing学习笔记4-通过调用面板中的按钮实现主界面动态切换皮肤的问题!
- JDK8新特性(十五)之重复注解、类型注解
- 【模拟】牛客网:区间表达
- Triple Generative Adversarial Nets
- jQuery EasyUI API 中文文档 - 数值微调器(NumberSpinner)
- php 中访问常量,php 中的常量
- 计算机网络工程师多久过期,软考网络工程师证书有效期
- raw格式怎么打开转换成jpg?迅捷图片转换器3步搞定
- IOS开发之UI进阶(设置圆角,边框颜色,边框宽度)
- OCCT 建模,VTK显示
- w7无法訪问计算机上硬盘分区,Win7/win10双系统无法打开磁盘分区提示拒绝访问怎么解决...
- 10nm 以一敌二 — 雷蛇灵刃潜行 2020 水银版评测
- 图案设计灵感怎么写_优秀Logo的设计灵感,从何而来?
- 我们在6月缅怀——上半年那些被卫星“刻录”的记忆、影像
- Ubuntu(18.04)下wechat_web_devtools的安装使用
- Delphi 多线程传递参数的问题
热门文章
- centos 6.5 安装rsync
- 避免uicollection view被错误的移动
- 用css去除chrome、safari等webikt内核浏览器对控件默认样式
- Pwn2Own 2022迈阿密大赛落幕 去年春季赛冠军蝉联Master of Pwn
- 丰田汽车顶级供应商 Denso 疑遭勒索攻击,被威胁泄露商业机密
- SAP 严重漏洞可导致供应链攻击
- 研究员公开Razer 0day,插入鼠标即可获得Windows管理员权限
- SonicWall 又爆已遭利用的 0day?!
- 开源的无客户端桌面远程网关 Apache Guacamole 被曝多个严重漏洞,可导致 RCE
- .Net Discovery 系列之三--深入理解.Net垃圾收集机制(上)