基本概念和原理

“泛型”的字面意思就是广泛的类型。接口和方法代码可以应用于广泛的类型,代码与他们能够操作的数据不在绑定在一起,同一套代码可以用于多种数据类型,这样不仅可以复用代码,降低耦合,而且可以提高代码的可读性和安全性。

这样的文字描述还是很抽象的,下面我们通过一些例子逐步进行说明。在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这门语言注重类型的安全性,通过使用泛型,开发环境和编译器能确保不会用错类型,为程序多设置一道安全防护网。使用泛型,还可以省去繁琐的强制类型转换,再加上明确的类型信息。代码可读性会更好。

泛型与容器连载(一)泛型的基本概念和原理相关推荐

  1. java object转泛型_为什么Java的泛型要用擦除实现

    在 Java 中的 泛型 ,常常被称之为 伪泛型 ,究其原因是因为在实际代码的运行中,将实际类型参数的信息擦除掉了 (Type Erasure) .那是什么原因导致了 Java 做出这种妥协的呢?下面 ...

  2. java 7 泛型_Java(7)泛型

    目录 一.泛型概述 1.什么是泛型 2.为什么用泛型 3.在集合中使用泛型 二.自定义泛型结构 1.泛型类.接口 2.泛型方法 三.举例泛型类和泛型方法的使用场景 1.泛型类举例: 2.泛型方法举例 ...

  3. java 集合与泛型_java的集合和泛型的知识点归纳1

    [Collection.泛型] 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 [ ] 能够说出集合与数组的区别 [ ] 说出Collection集合的常用功能 [ ] 能够使 ...

  4. 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较

    1: /// <summary> 2: /// 对比两个同类型的泛型集合并返回差异泛型集合 3: /// </summary> 4: /// <typeparam nam ...

  5. 泛型java 代码讲解_Java泛型详解

    2516326-5475e88a458a09e4.png 一,打破砂锅问到底 泛型存在的意义? 泛型类,泛型接口,泛型方法如何定义? 如何限定类型变量? 泛型中使用的约束和局限性有哪些? 泛型类型的继 ...

  6. java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

    原 java泛型(二).泛型的内部原理:类型擦除以及类型擦除带来的问题 2012年08月29日 23:44:10 Kilnn 阅读数:56717 版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  7. 什么是泛型,为什么要使用泛型? 泛型类和泛型方法的实现以及限定通配符的使用。什么是泛型擦除,为什么有泛型擦除,泛型擦除到底是怎么实现的

    1. 泛型的定义和意义 1.1 什么叫泛型? 泛型,顾名思义就是广泛的类型,专业术语为"参数化类型":当我们创建对象时没指定类型,任何引用类型都可以使用,兼容多种数据类型.如果是基 ...

  8. java泛型 例子_关于 Java 泛型的一些有趣的例子

    有以下的代码: 1 try{2 ArrayList lstA = new ArrayList();3 ArrayList lstB = new ArrayList();4 5 //ArrayList ...

  9. java中的泛型是什么_Java中泛型是什么?Java泛型的详细介绍

    本篇文章给大家带来的内容是关于Java中泛型是什么?Java泛型的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.什么是泛型? Java泛型设计原则:只要在编译时期没有出 ...

最新文章

  1. python【力扣LeetCode算法题库】322-零钱兑换(动态规划)
  2. 修改haproxy配置文件
  3. mysql grou平by_MySQL group by对单字分组序和多字段分组的方法讲解
  4. go 获得 mysql 实际运行 SQL,Golang实践录:一个数据库迁移的代码记录
  5. aswing学习笔记4-通过调用面板中的按钮实现主界面动态切换皮肤的问题!
  6. JDK8新特性(十五)之重复注解、类型注解
  7. 【模拟】牛客网:区间表达
  8. Triple Generative Adversarial Nets
  9. jQuery EasyUI API 中文文档 - 数值微调器(NumberSpinner)
  10. php 中访问常量,php 中的常量
  11. 计算机网络工程师多久过期,软考网络工程师证书有效期
  12. raw格式怎么打开转换成jpg?迅捷图片转换器3步搞定
  13. IOS开发之UI进阶(设置圆角,边框颜色,边框宽度)
  14. OCCT 建模,VTK显示
  15. w7无法訪问计算机上硬盘分区,Win7/win10双系统无法打开磁盘分区提示拒绝访问怎么解决...
  16. 10nm 以一敌二 — 雷蛇灵刃潜行 2020 水银版评测
  17. 图案设计灵感怎么写_优秀Logo的设计灵感,从何而来?
  18. 我们在6月缅怀——上半年那些被卫星“刻录”的记忆、影像
  19. Ubuntu(18.04)下wechat_web_devtools的安装使用
  20. Delphi 多线程传递参数的问题

热门文章

  1. centos 6.5 安装rsync
  2. 避免uicollection view被错误的移动
  3. 用css去除chrome、safari等webikt内核浏览器对控件默认样式
  4. Pwn2Own 2022迈阿密大赛落幕 去年春季赛冠军蝉联Master of Pwn
  5. 丰田汽车顶级供应商 Denso 疑遭勒索攻击,被威胁泄露商业机密
  6. SAP 严重漏洞可导致供应链攻击
  7. 研究员公开Razer 0day,插入鼠标即可获得Windows管理员权限
  8. SonicWall 又爆已遭利用的 0day?!
  9. 开源的无客户端桌面远程网关 Apache Guacamole 被曝多个严重漏洞,可导致 RCE
  10. .Net Discovery 系列之三--深入理解.Net垃圾收集机制(上)