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>{
@Override
public T method() {
return null;
}
}
实现泛型接口,指定类型:
class GeneratorImpl<T> implements Generator<String>{
@Override
public 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 和 Character
Integer[] 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