您的位置:首页 > 编程语言 > Java开发

Java核心技术(五) —— 泛型程序设计(1)

2016-05-09 20:03 435 查看
本文主要针对泛型程序设计,从以下方面进行讲解:

为何使用泛型程序设计

定义简单的泛型类

泛型方法

类型变量的限定

泛型代码和虚拟机

约束与局限性

泛型类型的继承规则

通配符类型

反射和泛型

泛型程序设计,意味着编写的代码可以被很多不同类型的对象所重用。

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: