Java核心技术卷I:基础知识(原书第8版):12.2 简单泛型类的定义
2014-10-21 09:34
423 查看
铁文整理
public
class Pair<T> {
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;
}
private T
first;
private T
second;
}
Pair类引入了一个类型变量T,用尖括号括起来,并放在类名的后面。泛型类可以有多个类型变量。例如,可以定义Pair类,其中第一个域和第二个域使用不同的类型:
public
class Pair<T, U> { ... }
类定义中的类型变量指定方法的返回类型以及域和局部变量的类型。例如,
private T
first; // uses type variable
注释:类型变量使用大写形式,且比较短,这是很常见的。在Java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值的类型。T(需要时还可以用临近的字母U和S表示“任意类型”。
用具体的类型替换类型变量就可以实例化泛型类型,例如:
Pair<String>
可以将结果想像成带有构造器的普通类:
Pair<String>()
Pair<String>(String, String)
和方法:
String getFirst()
String getSecond()
void setFirst(String)
void setSecond(String)
换句话说,泛型类可看作普通类的工厂。
例12-1中的程序使用了Pair类。静态的minmax方法遍历了数组并同时计算出最小值和最大值。它用一个Pair对象返回了两个结果。回想一下compareTo方法比较两个字符串,如果字符串相同则返回0,如果按照字典顺序,第一个字符串比第二个字符串靠前,就返回负值,否则,返回正值。
C++注释:从表面上看,Java的泛型类类似于C++的糢板类,惟一明显的不同是Java没有专用的template关键字。但是,在本章中读者将会看到,这两种机制有着本质的区别。
例12-1 PairTest1.java
/**
* @version 1.00 2004-05-10
* @author Cay Horstmann
*/
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<String>(min, max);
}
}
12.2 简单泛型类的定义
一个泛型类就是具有一个或多个类型变量的类。本章使用一个简单的Pair类作为例子。对于这个类来说,我们只关注泛型,而不会为数据存储的细节烦恼。下面是Pair类的代码:public
class Pair<T> {
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;
}
private T
first;
private T
second;
}
Pair类引入了一个类型变量T,用尖括号括起来,并放在类名的后面。泛型类可以有多个类型变量。例如,可以定义Pair类,其中第一个域和第二个域使用不同的类型:
public
class Pair<T, U> { ... }
类定义中的类型变量指定方法的返回类型以及域和局部变量的类型。例如,
private T
first; // uses type variable
注释:类型变量使用大写形式,且比较短,这是很常见的。在Java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值的类型。T(需要时还可以用临近的字母U和S表示“任意类型”。
用具体的类型替换类型变量就可以实例化泛型类型,例如:
Pair<String>
可以将结果想像成带有构造器的普通类:
Pair<String>()
Pair<String>(String, String)
和方法:
String getFirst()
String getSecond()
void setFirst(String)
void setSecond(String)
换句话说,泛型类可看作普通类的工厂。
例12-1中的程序使用了Pair类。静态的minmax方法遍历了数组并同时计算出最小值和最大值。它用一个Pair对象返回了两个结果。回想一下compareTo方法比较两个字符串,如果字符串相同则返回0,如果按照字典顺序,第一个字符串比第二个字符串靠前,就返回负值,否则,返回正值。
C++注释:从表面上看,Java的泛型类类似于C++的糢板类,惟一明显的不同是Java没有专用的template关键字。但是,在本章中读者将会看到,这两种机制有着本质的区别。
例12-1 PairTest1.java
/**
* @version 1.00 2004-05-10
* @author Cay Horstmann
*/
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<String>(min, max);
}
}
相关文章推荐
- Java核心技术卷I:基础知识(原书第8版):13.2 具体的集合
- Java核心技术卷I:基础知识(原书第8版):12.4 类型变量的限定
- Java核心技术卷I:基础知识(原书第8版):14.8 Callable与Future
- Java核心技术卷I:基础知识(原书第8版):12.5 泛型代码和虚拟机
- Java核心技术卷I:基础知识(原书第8版):10.1 JAR文件
- Java核心技术卷I:基础知识(原书第8版):13.5 遗留的集合
- Java核心技术卷I:基础知识(原书第8版):14.10 同步器
- Java核心技术卷I:基础知识(原书第8版):6.2 对象克隆
- Java核心技术卷I:基础知识(原书第8版):14.11 线程与Swing
- Java核心技术卷I:基础知识(原书第8版):11.4 断言
- Java核心技术卷I:基础知识(原书第8版):14.4 线程属性
- Java核心技术卷I:基础知识(原书第8版):13.1 集合接口
- Java核心技术卷I:基础知识(原书第8版):14.7 线程安全的集合
- Java核心技术卷I:基础知识(原书第8版):6.1 接口
- Java核心技术卷I:基础知识(原书第8版):13.4 算法
- Java核心技术卷I:基础知识(原书第8版):12.6 约束与局限性
- Java核心技术卷I:基础知识(原书第8版):11.1-11.3 异常
- Java核心技术卷I:基础知识(原书第8版):6.5 代理
- Java核心技术卷I:基础知识(原书第8版):5.2.2 相等测试与继承
- Java核心技术卷I:基础知识(原书第8版):10.4 应用程序存储的配置