为什么要用泛型程序设计?
A: 意味着写的代码可以对多种不同的对象重用。例如:可能不希望为手机String和File对象分别编写不同的类,此时一个ArrayList类就可以收集任何类的对象。
一般泛型在需要大量使用到通用类型(如Object和Comparable接
口)的强转时用来代替比较好
——————————————————————————
定义简单泛型类
泛型类:有一个/多个类型变量的类
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;}
}
这个类型变量列表中也可以定有多个,如<T,U>
类型变量在整个类定义中用于指定方法的返回类型以及字段和局部变量的类型:
private T first;
某种意义上,泛型类相当于普通类的工厂
泛型方法
同样的,还可以定义一个带有类型参数的方法:
class ArrayAlg
{
public static <T> T getMiddle(T...a)
{
return a[a.length/2];
}
}
这个方法定义于普通类中,这说明泛型方法不一定需要在泛型类中定义
调用:
String middle = ArrayAlg.<String>
getMiddle(" John","Q.","Public");
由于参数都是T类型,当传入全为String类型的时候可以省略类型参数1
String middle = ArrayAlg.getMiddle("John","Q.","public");
C++中的类型变量实际是在方法名之后·的,这会导致如下情况:
g(f<a,b>(c))可以理解为将f<a,b>(c)的返回值传给g()
但也可以理解为:g()内 f<a和b>(c)这两个布尔值作为参数,这就产生
很明显的二义性
————————————————————————
对类型变量的限定
比如在一个泛型方法中,调用了变量的compareTo方法,
但是要怎么确保类型变量的类中一定有一个compareTo方法呢?
可以限定T只能是实现了Comparable接口(包含一个方法compareTo的标准接口)的类
语法如下:
public static <T extends Comparable>T min (T[] a)....
在此处由于extends在思路上更契合(估计是),所以没有涉及impments ,虽然它是实现接口的真正关键字
a extend B&C,d extend E&F....
一般如上,逗号分隔变量,&分隔限定
最多有一个类限定,接口限定可以有很多;
类限定有的话必须在第一个位置!!!
高级拓展
书p333