泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。

1.泛型类:

一个泛型类(generic class)就是具有一个或多个类型变量的类。本章使用一个简单的 Pair 类作为例子。对于这个类来说,我们只关注泛型,而不会为数据存储的细节烦恼。下面是 Pair 类的代码:

  1. public class Pair<T>
  2. {
  3. private T first;
  4. private T second;
  5. public Pair() { first = null; second = null; }
  6. public Pair(T first, T second) { this.first = first; this.second = second; }
  7. public T getFirst() { return first; }
  8. public T getSecond() { return second; }
  9. public void setFirst(T newValue) { first = newValue; }
  10. public void setSecond(T newValue) { second = newValue; }
  11. }

Pair类引入了一个类型变量 T,用尖括号(< >)括起来, 并放在类名的后面。泛型类可以有多个类型变量。 例如,可以定义 Pair 类,其中第一个域和第二个域使用不同的类型:
public class Pair<T, U> {. . . }
类定义中的类型变量指定方法的返回类型以及域和局部变量的类型。例如,
private T first; //uses the type variable

注释:类型变量使用大写形式,且比较短,这是很常见的。在 Java 库中,使用变量 E 表示集合的元素类型, KV 分别表示表的关键字与值的类型。T (需要时还可以用临近的字母 US**)表示 “任意类型”。

用具体的类型替换类型变量就可以实例化泛型类型,例如:
Pair<String>
可以将结果想象成带有构造器的普通类:
Pair<String>()
Pair<String>(String, String)
和方法:
String getFirst()
String getSecond()
void setFirst(String)
void setSecond(String)

换句话说,泛型可看作普通类的工厂。

2.泛型接口 :

  1. public interface Generator<T> {
  2. public T method();
  3. }

java泛型的一个局限性:基本类型无法作为类型参数。

实现泛型接口,不指定类型:

  1. class GeneratorImpl<T> implements Generator<T>{
  2. @Override
  3. public T method() {
  4. return null;
  5. }
  6. }

实现泛型接口,指定类型:

  1. class GeneratorImpl<T> implements Generator<String>{
  2. @Override
  3. public String method() {
  4. return "hello";
  5. }
  6. }

3.泛型方法 :

是否拥有泛型方法,与其所在的类是否是泛型类没有关系。
泛型方法使得该方法能够独立于类而产生变化。对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。
要定义泛型方法,只需将泛型参数列表置于返回值之前,就像下面这样:

  1. public static < E > void printArray( E[] inputArray )
  2. {
  3. for ( E element : inputArray ){
  4. System.out.printf( "%s ", element );
  5. }
  6. System.out.println();
  7. }

使用:

  1. // 创建不同类型数组: Integer, Double 和 Character
  2. Integer[] intArray = { 1, 2, 3 };
  3. String[] stringArray = { "Hello", "World" };
  4. printArray( intArray );
  5. printArray( stringArray );

常用的通配符为: T,E,K,V,?

  • ? 表示不确定的 java 类型
  • T (type) 表示具体的一个 java 类型
  • K V (key value) 分别代表 java 键值中的 Key Value
  • E (element) 代表 Element