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

  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

 

最新文章

  1. linux随笔2
  2. CentOS 6.X安装LAMP最高版本环境
  3. 3ds max 2016 新功能
  4. PHP 12 :字符串的操作
  5. centos yum 没有可用软件包 nginx。
  6. CoordinatorLayout与滚动的处理
  7. Myeclipse插件快速生成ssh项目并配置注解 在action层注入service的超详细过程
  8. Win10系统盘制作及安装流程
  9. 执行Android后台任务的最佳实践
  10. iview中,table组件在缩进时产生的bug。
  11. MMU学习总结
  12. PHP5.4.0新特性研究
  13. 【规范】前端编码规范——javascript 规范
  14. 20145215《网络对抗》Exp2 后门原理与实践
  15. 在PHP中使用协程实现多任务调度
  16. 如何解析本地和线上XML文件获取相应的内容
  17. HDU2017新生赛 找方块
  18. RowMapper使用
  19. 转载《Spring AOP中pointcut expression表达式解析 及匹配多个条件》
  20. Python学习笔记_获取当前目录和上级目录

热门文章

  1. 记一次jmeter从txt文本获取数值并给测试计划的变量赋值,jmeter永久性修改变量。
  2. HashMap和Hashtable的联系和区别
  3. Java 内存模型与内存结构
  4. locate,find
  5. python语言程序设计基础(嵩天)第三章课后习题部分个人练习
  6. Zabbix监控方案-官方最新4.4版本
  7. 31、vue-cli3引入封装svg图标
  8. 什么是Cookie?——每日一题20190623
  9. Java8 Period.between方法坑及注意事项
  10. nextjs:如何将静态资源发布到 CDN