Java泛型知识总结
泛型
前言
在没有泛型之前,程序员必须使用Object编写适用于多种类型的代码。很繁琐,也不安全。
泛型的引入使Java有了一个很强的类型系统,允许设计者详细地描述变量和方法的类型要如何变化。
在普通的情况下,实现泛型代码很容易。在更高级的情况下,我们的目标是提供让其他程序员可以轻松使用的类和方法,这对实现者来说会非常复杂。
为什么要使用泛型
用泛型编写的代码可以对多种不同对象的类型进行重用。
没有泛型之前,使用Object(继承)实现不同类型对象间的匹配。这种方法有两个弊端
- 获取一个值时必须进行强制转换(繁琐)
 - 编译期没有错误检查(不安全)
 
因此,泛型提供了一种解决方案:类型参数(type parameter)。 使代码更具有可读性。
编译器也可以充分利用这个类型信息。调用get的时候不需要强制转换。编译器还知道add方法有一个类型为String的类型参数,这比Object类型要安全。现在,编译器可以检查,防止你插入错误类型的对象。编译期出现错误比运行期出现类的强制转换异常要好的多。
泛型类
有一个或多个类型变量的类。
例如:定义一个类型变量T,用 <> 括起来,放在类名后边。泛型类还可以有多个类型变量,<T, U>。
变量类型可以应用于方法的返回值类型以及字段和局部变量。
使用具体的类型替换类型变量来实例化反省类型,可以把结果想像成一个普通类。
泛型方法
泛型方法可以定义在普通类中,也可以定义在泛型类中。
注意,泛型变量要放在方法返回值前。
调用泛型方法的方式(例子是调用静态方法):
- ArrAlg.<String>getMiddle(); 注意调用格式
 - ArrAlg.getMiddle(); 简单调用
 
类型变量的限定
场景:某个方法参数为泛型T,在方法体中要调用compareTo方法来比较大小,既然使用了泛型,说明该方法可以传入任何参数对象,那么如何知道T所属的类有一个compareTo方法呢?
解决这个问题的方法就是限制T只能是实现了Comparable接口的类。可以通过对变量类型T设置一个限定来实现这一点:public static <T extends Comparable> T min(T[] t)
此时,在调用泛型方法min时只能传递实现了Comparable接口的类型对象的参数。
语法就是:<T extends BoundingType>,T和限定类可以是类也可以是接口。
一个类型变量或通配符可以有多个限定:
- 类型变量用逗号分隔
- <T, U extends Comparable>
 
 - 限定类型用&分隔
- <T extends Comparable & Serializable>
 
 
注意: 可以限定多个接口,类最多只能限定一个。如果有一个类作为限定,这个类必须是第一个限定。
泛型代码和虚拟机
无论何时定义一个泛型,都会自动提供一个原始类型(raw type)。这个原始类型就是去掉类型参数后的泛型类型名。对于无限定的变量替换为Object。
原始类型第一个限定类型来替换类型变量,如果没有给定限定,则替换为Object。例如:
public class Interval<T extends Comparable & Serializable> {
    private T lower;
}
// Comparable为第一个限定类型,所以使用它来替换
public class Interval {
    private Comparable lower;
}
泛型转换的步骤
- 对原始方法Pair.getFirst调用返回Object类型
 - 将返回的Object类型转换为Employee类型
 
泛型转换规则
- 虚拟机中没有泛型,只有普通的类和方法
 - 所有的类型参数都会替换为他们的限定类型
 - 会合成桥方法来保持多态
 - 为保持类的安全性,必要时会插入强制类型转换
 
@SuppressWarnings("unchecked")
这个注解会关闭代码检查
泛型的限制与局限性
- 泛型不能使用基本数据类型
 - 类型比较只适用于原始类型
 - 不能创建泛型数组
 
通配符
泛型通配符搭配集合使用一般在方法的参数中比较常见
方法中的参数是一个集合,集合如果携带了通配符,要特别注意如下:
1 集合的类型会提升为Object类型。
2 方法中的参数是一个集合,集合如果携带了通配符,那么此集合不能进行添加和修改操作 , 可以删除和获取
在集合中泛型是不支持多态的,如果为了匹配任意类型,我们就会使用泛型通配符了。
<?> 可以表示任意类型
受限通配符
对泛型做约束,给泛型指定类型时,只能是某个类的父类或子类。
- 下限
- ? super 类型
 
 - 上限
- ? extends 类型
 
 
visualgo.net
Java泛型知识总结的更多相关文章
- JAVA泛型知识(一)
		
Java泛型知识(二)<? extends T>和<? super T> Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 目 录 ...
 - JAVA泛型知识--> <? extends T>和<? super T>
		
<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...
 - JAVA泛型知识(二)--> <? extends T>和<? super T>
		
<? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...
 - Java开发知识之Java中的泛型
		
Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类. ...
 - 《Java基础知识》Java 泛型详解
		
JDK 1.5 之后,Java 通过泛型解决了容器类型安全这一问题,而几乎所有人接触泛型也是通过Java的容器.那么泛型究竟是什么? 泛型的本质是参数化类型:也就是说,泛型就是将所操作的数据类型作为参 ...
 - Java核心知识1:泛型机制详解
		
1 理解泛型的本质 JDK 1.5开始引入Java泛型(generics)这个特性,该特性提供了编译时类型安全检测机制,允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,即给类型指定一个参 ...
 - 浅析Java 泛型
		
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
 - (翻译)反射处理java泛型
		
当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息.这就是本文将要介绍的ReflectionUtil就是为了解决这类问题的辅助工具类,为java. ...
 - Java基础知识强化14:Java死亡竞赛题目解析
		
一个小型网站上发布了一个称为Java“死亡竞赛”的新项目.测验发布后,超过20000位开发者参加了测验.网站以20道关于Java的多选题为主.我们得到了众多开发者的测验统计数据,今天,我们非常乐意 ...
 
随机推荐
- uView的DatetimePicker详解
			
uView UI号称: 是全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 亲身感受,用起来真的坑太多, 官方文档太简洁, 很多配置都没说明也没代码, 上百度查 ...
 - 帝国CMS只备份栏目和模板的方法
			
方法一:不备份所有帝国cms数据内容表 我们知道帝国cms有8大模型,分别是 1.新闻系统数据表 ( phome_ecms_news )2.下载系统数据表 ( phome_ecms_download ...
 - 高精度加法(C++实现)
			
高精度加法 简介 用于计算含有超过一般变量存放不下的非负整数 高精度加法这个过程是模拟的小学竖式加法计算 步骤 以下有顺序之分 数组清零 输入 获取长度 逆置 字符型数字转成对应的整型数字 计算并输出 ...
 - 有关JavaScript事件循环的若干疑问探究
			
起因 即使我完全没有系统学习过JavaScript的事件循环机制,在经过一定时间的经验积累后,也听过一些诸如宏任务和微任务.JavaScript是单线程的.Ajax和Promise是一种异步操作.se ...
 - mysql组提交
			
当mysql开启binlog日志时,会存在一个内部XA的问题:事务在存储引擎层redo log的写入和binlog的写入一致性问题. mysql通过两阶段提交很好的解决了redo log和binlog ...
 - ArcGIS使用技巧(三)——关于投影
			
新手,若有错误还请指正! 简单记录一下自己所理解的ArcGIS中的有关投影的知识点. 在数据处理过程中,基本都是需要将相关数据放在同一投影坐标系下,需要用到投影转换工具,但若有的数据没有坐标信息,则首 ...
 - 音视频基本概念和FFmpeg的简单入门
			
写在前面 最近正好有音视频编辑的需求,虽然之前粗略的了解过FFmpeg不过肯定是不够用的,借此重新学习下: 基本概念 容器/文件(Conainer/File): 即特定格式的多媒体文件,一般来说一个视 ...
 - Java类型跟数据库类型的相互转换
			
1.自定义一个转换类型,获取数据库数据并输出数据时,把数据库的Varchar类型转为java的String[]类型 前提(1) 定义一个类VarcharToStringsHandler继承BaseTy ...
 - 单列集合(Collection-Set)
			
(部分) Set类特点: "无序"(输入顺序和存储顺序不一样) HashSet 底层是HashMap 关于不能有重复元素/对象 遇到的问题: 解决办法:重新类的相关方法 选择名字和 ...
 - bellman-ford 单源最短路问题 图解
			
 核心思想:松弛操作 对于边(u,v),用dist(u)和(u,v)的和尝试更新dist(v): dist(v) = min(dist(v) , dist(u)+l(u,v) 注:dist(i)为源 ...