泛型
1,泛型类的静态上下文中类型变量无效
public class Singleton<T>
{
private static T singlelnstance; // Error
public static T getSinglelnstanceO // Error
{
if (singleinstance == null) construct new instance of T
return singlelnstance;
}
}
2,不能抛出或捕获泛型类的实例
public class Problem<T> extends Exception { /* . . . */ } // Error can't extend Throwable
下面的方法不能编译
public static <T extends Throwable〉void doWork(Class<T> t)
{
try
{
do work
}
catch (T e) // Error can't catch type variable
{
Logger,global.info(...)
}
}
不过, 在异常规范中使用类型变量是允许的。以下方法是合法的:
public static <T extends Throwable〉void doWork(T t) throws T // OK
try{
do work
}
catch (Throwable real Cause)
{
t .initCause( real Cause) ;
throw t ;
}
}
3,通配符类型
Pair<? extends Employee> 标识为泛型Pair类型, 它的类型参数是Employee的之类, 如Pari
Pari<? super Employee> 通配符限制为Employee的所有超类型
无限定通配符 Pair<?>
? getFi rst()
void setFirst ⑺
getFirst 的返回值只能赋给一个Object。setFirst 方法不能被调用, 甚至不能用Object 调
用。Pair<?> 和Pair 本质的不同在于: 可以用任意Object 对象调用原始Pair 类的setObject方法
可以调用setFirst(null)
4,泛型类
public class Pair<T>
{
private T first;
private T second;
public Pair() { first = null ; second = null ; }
public PairfT first , T second) { this,first = first; this.second = second; }
public T getFirstO { return first; }
public T getSecondO { return second; }
public void setFirst (T newValue) { first = newValue; }
public void setSecond(T newValue) { second = newValue; }
}
Pair 类引人了一个类型变量T,用尖括号( < >) 括起来,并放在类名的后面
在Java 库中, 使用变量E 表示集合的元素类型, K 和V 分别表示表的关键字与值的类型。T ( 需要时还可以用临近的
字母U 和S) 表示“ 任意类型”。
5,泛型方法
class ArrayAlg{
public static <T> T getMiddle(T... a){
return a[a.length / 2];
}
}
这个方法是在普通类中定义的, 而不是在泛型类中定义的。然而,这是一个泛型方法,
可以从尖括号和类型变量看出这一点。注意,类型变量放在修饰符(这里是public static ) 的
后面,返回类型的前面。
泛型方法可以定义在普通类中,也可以定义在泛型类中。
6,类型变量的限定
引人了一个类型变量T, Pair 声明返回数据类型
class ArrayAl{
public static <T extends Comparable〉Pair<T> minmax(T[] a){
if (a = null 11 a.length == 0) return null ;
T min = a[0];
T max = a[0];
for (int i = 1; i < a.length; i++){
if (inin.compareTo(a[i]) > 0) min = a[i];
if (max.coinpareTo(a[i]) < 0) max = a[i];
}
return new Pairo(m'n, max) ;
}
}