一、泛型程序的定义和使用

  1.为什么要使用泛型程序设计

  泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用。同时,使得程序具有更好的可读性和安全性。

ArrayList<String> files = new ArrayList<>();

  泛型使用类型参数来指示元素的类型,例如“String”。有两个好处:

  • 当调用get的时候,不需要进行强制类型转换,编译器就知道返回值的类型是String,而不是Object
String filename = files.get(0);
  • 当调用ArrayList中的add方法时,只能限定传递给add方法的参数的类型是String,这样可以进行检查,避免插入错误类型的对象。例如:
files.add(new File("..."))

  这样代码是无法通过编译的。但是如果不使用泛型,files就是一个Object类型的对象,那么这条代码是可以通过编译的。

  

  2.定义简单泛型类

public class Pair<T>        // 类中引用了一个类型变量T
{
private T first; // 指定域的类型
private T second; public Pair() { first = null; second = null; }
public Pair(T first, T second) { this.first = first; this.second = second; } // 指定方法参数的类型 public T getFirst() { return first; } // 指定方法返回参数的类型
public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; } // 指定方法参数的类型
public void setSecond(T newValue) { second = newValue; }
}

  3.在普通类中定义泛型方法

class ArrayAlg{
public static <T> T getMiddle(T..a){
return a[a.length/2];
}
}

  当调用一个泛型方法时,在方法名前的尖括号中放入具体的类型:

String middle = ArrayAlg.<String>getMiddle(" ...","...","...")

  4.类型变量的限定

class ArrayAlg
{
public static <T extends Comparable> Pair<T> minmax(T[] a)
{
if (a == null || a.length == 0) return null;
T min = a[0];
T max = a[0];
for (int i = 1; i < a.length; i++)
{
if (min.compareTo(a[i]) > 0) min = a[i];
if (max.compareTo(a[i]) < 0) max = a[i];
}
return new Pair<>(min, max);
}
}

  为了确定T所属的类有compareTo方法,可以将T限制为实现了Comparable接口的类,也就是<T extends Comparable>。一个类型变量或通配符可以有多个限定,用“&”连接即可。

  二、泛型程序的约束和局限性

  1.不能用类型参数代替基本类型。

  例如:不能用Pair<double>,而只能用Pair<Double>

  2.运行时类型查询只适用于原始类型

  如果想要查询一个对象是否属于某个泛型类型时,使用instanceof会得到一个编译器错误,如果使用强制类型转换会得到一个警告。

  虚拟机中的对象总有一个特定的非泛型类型,因此,所有的类型查询只产生原始类型。

if  (a instanceof Pair<String>)   // 得到一个编译器ERROR
if (a instanceof Pair<T>) // 得到一个编译器ERROR
Pair<String> p = (Pair<String>)a; // 得到一个警告,因为测试的只是a是否是任意类型的一个Pair,而无法限定是String

 

Java基础(三十)泛型程序(Generic Programming)的更多相关文章

  1. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

  2. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  3. Java进阶(三十八)快速排序

    Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...

  4. Java进阶(三十五)java int与integer的区别

    Java进阶(三十五)java int与Integer的区别 前言 int与Integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而Integer是对象 ...

  5. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  6. “全栈2019”Java第三十九章:构造函数、构造方法、构造器

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. “全栈2019”Java第三十八章:类与方法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第三十六章:类

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第三十五章:面向对象

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  10. “全栈2019”Java第三十四章:可变参数列表

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. 多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  2. selenium--定位--CSS

    大家在使用selenium元素定位的时候,通常更多使用的是XPATH,css定位方式用得比较少 但有时候css定位方式还是有一些优势的, 优势1:一般情况下定位速度要比XPATH快 优势2:语法要比X ...

  3. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  4. VMware安装出现"已将该虚拟机配置为使用 64 位客户机操作系统"

    1.环境:ThinkPad电脑 系统:win10 64位.VMWare运行虚拟机发现提示无法执行64位操作. 2.解决办法: ⑴ 进入BOIS中 ⑵ 选择Security字段,进入Virtualiza ...

  5. PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 [转载]

    PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 2011-12-02 17:09:39|  分类: PHP|举报|字号 订阅     下载LOFTER我的照片书   ...

  6. Spring只定义接口自动代理接口实现类

    能够扫描到包 @ComponentScan("org.zxp.esclientrhl") ESCRegistrar类主要实现ImportBeanDefinitionRegistra ...

  7. TP5安装workerman版本的坑

    今天想在TP5上安装workerman,用于个人学习,然后悲剧的是,第一步就卡住了,根据手册里说的首先通过composer安装 composer require topthink/think-work ...

  8. 2.css3表示颜色的几种方式

    1.css3中表示颜色的几种方式: ⑴颜色名称.十六进制.RGB方式: ⑵RGBA方式:新增了alpha参数,介于0.0(完全透明)到1.0(完全不透明)之间: ⑶HSL方式:分别表示色调.饱和度.亮 ...

  9. IDEA统一注释格式(干货)

    统一注释格式: Idea自动生成注释: /** *@author 你的名字的简写 *@date ${DATE}${TIME} 在每个功能上添加注释,例子如下: 我在Mapper文件中添加了自己书写的S ...

  10. 用OllyDbg爆破一个小程序

    用OllyDbg爆破一个小程序 一.TraceMe小程序 TraceMe是对用户名.序列号判断是否合法的一个小程序.我们任意输入一组用户名.序列号进行check判断,结果如下: 二.用OllyDbg对 ...