Java核心技术(五) —— 泛型程序设计(1)
2016-05-09 20:03
435 查看
本文主要针对泛型程序设计,从以下方面进行讲解:
为何使用泛型程序设计
定义简单的泛型类
泛型方法
类型变量的限定
泛型代码和虚拟机
约束与局限性
泛型类型的继承规则
通配符类型
反射和泛型
泛型程序设计,意味着编写的代码可以被很多不同类型的对象所重用。
其中,Pair类引入了一个类型变量T,一般用比较短的大写形式来书写。实际上泛型类可以有多个类型变量,如上述程序中可以定义第一个域和第二个域具有不同的类型
之后,只要用具体的类型替换类型变量就可以实例化泛型类型了。
好,下面用一个综合的例子来说明
注意,类型变量
(1)泛型方法可以定义在普通类中,也可以定义在泛型类中。
(2)当调用泛型方法时,在方法名前的<>中放入具体的类型即可
实际上,大多数情况下编译器有足够的信息能够推断出所调用的方法,即绝大多数情况下可以直接调用
如下例是将T限制为实现了Comparable接口的类,
而且一个类型变量或者通配符可以有多个限定,限定类型用&分隔,类型变量用逗号来分隔。
下面,我们用段程序来复习下
为何使用泛型程序设计
定义简单的泛型类
泛型方法
类型变量的限定
泛型代码和虚拟机
约束与局限性
泛型类型的继承规则
通配符类型
反射和泛型
泛型程序设计,意味着编写的代码可以被很多不同类型的对象所重用。
1、泛型类
一个泛型类就是具有一个或多个类型变量的类,如定义一个Pair类其中,Pair类引入了一个类型变量T,一般用比较短的大写形式来书写。实际上泛型类可以有多个类型变量,如上述程序中可以定义第一个域和第二个域具有不同的类型
之后,只要用具体的类型替换类型变量就可以实例化泛型类型了。
好,下面用一个综合的例子来说明
package pair1; public class PairTest1 { public static void main(String[] args) { String[] words = { "Mary", "had", "a", "little", "lamb" }; Pair<String> mm = ArrayAlg.minmax(words); System.out.println("min = " + mm.getFirst()); System.out.println("max = " + mm.getSecond()); } } class ArrayAlg { /** * Gets the minimum and maximum of an array of strings. * @param a an array of strings * @return a pair with the min and max value, or null if a is null or empty */ public static Pair<String> minmax(String[] a) { if (a == null || a.length == 0) return null; String min = a[0]; String 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); } }
2、泛型方法
前面介绍了定义简单的泛型类,实际上,还可以定义一个带有类型参数的简单方法,例注意,类型变量
<T>放在修饰符(这里是public static)后面,返回类型(这里是T)的前面。
(1)泛型方法可以定义在普通类中,也可以定义在泛型类中。
(2)当调用泛型方法时,在方法名前的<>中放入具体的类型即可
实际上,大多数情况下编译器有足够的信息能够推断出所调用的方法,即绝大多数情况下可以直接调用
3、类型变量的限定
有时需要对类型变量T设置限定,<T extends BoundingType>,表示T应该是绑定类型BoundingType的子类型,T和绑定类型BoundingType可以是类,也可以是接口。
如下例是将T限制为实现了Comparable接口的类,
而且一个类型变量或者通配符可以有多个限定,限定类型用&分隔,类型变量用逗号来分隔。
下面,我们用段程序来复习下
package pair2; import java.util.*; public class PairTest2 { public static void main(String[] args) { GregorianCalendar[] birthdays = { new GregorianCalendar(1906, Calendar.DECEMBER, 9), // G. Hopper new GregorianCalendar(1815, Calendar.DECEMBER, 10), // A. Lovelace new GregorianCalendar(1903, Calendar.DECEMBER, 3), // J. von Neumann new GregorianCalendar(1910, Calendar.JUNE, 22), // K. Zuse }; Pair<GregorianCalendar> mm = ArrayAlg.minmax(birthdays); System.out.println("min = " + mm.getFirst().getTime()); System.out.println("max = " + mm.getSecond().getTime()); } } class ArrayAlg { /** Gets the minimum and maximum of an array of objects of type T. @param a an array of objects of type T @return a pair with the min and max value, or null if a is null or empty */ 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); } }
相关文章推荐
- Maven学习3之eclipse安装maven
- 用Java代码打印菱形
- Ubuntu搭建Java开发环境
- 安卓java层操作数据库
- java类型
- java 类文件结构
- Java中的输出流
- java四舍五入保留几位小数
- Java Web实用小知识02
- java基础之内部类总结利用招聘
- JAVA基础之——HashSet中是如何判断元素是否重复的
- 将Eclipse项目导入Android Studio出现中文乱码的问题
- JDk安装及配置
- javaweb常见易错问题大汇总
- Spring声明式事务配置管理方法
- Java之Callable Future FutureTask Exectuor使用笔记
- JAVA基础之——深入理解Java的接口和抽象类
- 完整全面的Java资源库(包括构建、操作、代码分析、编译)
- java设计模式之——代理模式
- 《java入门第一季》之类String类小案例