1.泛型类:
一个泛型类(generic class)就是具有一个或多个类型变量的类。本章使用一个简单的 Pair 类作为例子。对于这个类来说,我们只关注泛型,而不会为数据存储的细节烦恼。下面是 Pair 类的代码:
public class Pair<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; }}
Pair类引入了一个类型变量 T,用尖括号(< >)括起来, 并放在类名的后面。泛型类可以有多个类型变量。 例如,可以定义 Pair 类,其中第一个域和第二个域使用不同的类型:public class Pair<T, U> {. . . }
类定义中的类型变量指定方法的返回类型以及域和局部变量的类型。例如,private T first; //uses the 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)
换句话说,泛型可看作普通类的工厂。
2.泛型接口 :
public interface Generator<T> {public T method();}
java泛型的一个局限性:基本类型无法作为类型参数。
实现泛型接口,不指定类型:
class GeneratorImpl<T> implements Generator<T>{@Overridepublic T method() {return null;}}
实现泛型接口,指定类型:
class GeneratorImpl<T> implements Generator<String>{@Overridepublic String method() {return "hello";}}
3.泛型方法 :
是否拥有泛型方法,与其所在的类是否是泛型类没有关系。
泛型方法使得该方法能够独立于类而产生变化。对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
要定义泛型方法,只需将泛型参数列表置于返回值之前,就像下面这样:
public static < E > void printArray( E[] inputArray ){for ( E element : inputArray ){System.out.printf( "%s ", element );}System.out.println();}
使用:
// 创建不同类型数组: Integer, Double 和 CharacterInteger[] intArray = { 1, 2, 3 };String[] stringArray = { "Hello", "World" };printArray( intArray );printArray( stringArray );
常用的通配符为: T,E,K,V,?
- ? 表示不确定的 java 类型
- T (type) 表示具体的一个 java 类型
- K V (key value) 分别代表 java 键值中的 Key Value
- E (element) 代表 Element
