泛型程序设计(Generic programming)的魅力所在:编写的代码可以被不同的类型对象所复用。
类型参数的意义:以前没有类型参数的时候ArrayList里面的里面添加不同类型的对象,不会报错,但是你取出的时候需要进行强制类型转换,就会报错,不同的对象需要进行不同的对象的类型转换。有了泛型之后,你添加的类型就可以确认,如果类型不对编译的时候就会报错,泛型是编译时作用,而不是运行时作用。
ArrayList<String> files=new ArrayList<>();//<>里面不需要写String在JAVA7之后就不用写了
arrayList.add("hjsjy");
arrayList.add(1);//不同类型就会编译报错
arrayList.get(0);//
例子
下面 T extends Comparable 这句 extends的原因extends更接近子类的概念,可以是类或者接口。
多个接口或者类 需要 &符号。
T extends Comparable&Serializable
/**
* 计算泛型数组的最大值和最小值
*
* @author hjsjy
* @create 2018/10/8
* @since 1.0.0
*/
public class PairTest {
public static void main(String[] args) {
LocalDate[] birthdays={
LocalDate.of(1992, 1, 4),
LocalDate.of(1993, 5, 1),
LocalDate.of(1994, 4, 2),
LocalDate.of(1995, 3, 3),
LocalDate.of(1996, 2, 7)
};
Pair<LocalDate> minmax = Arrayminmax.minmax(birthdays);
System.out.println(minmax.getFirst());
System.out.println(minmax.getSecond());
}
}
class Arrayminmax{
public static <T extends Comparable> Pair<T> minmax(T[] a){//<T extends Comparable> 是类型参数, Pair<T>是返回值类型
if(a==null||a.length==0){
return null;
}
T min = a[0];
T max = a[0];
for (int i = 1; i <a.length ; i++) {
if(min.compareTo(a[i])>0){
min = a[i];
}
if(min.compareTo(a[i])<0){
max = a[i];
}
}
return new Pair<>(min,max);//这里面<>里面不需要写
}
}
- 不能使用基本类型是实例化类型参数
没有Pair< double>,只有Pair< Double> 因为类型擦除之后Pair类含有Object类型,Object不能存储double值。 - 不能创建参数化类型的数组
Pair< String >[] table=new Pair< String>[10];//Error - 不能实例化类型变量
new T(…) T.class new T[…] Error - 不能在泛型类的静态上下文中类型变量无效
public class Single<T>{
private static T singleInstance;//error
public static getSIngleInstance(){//error
return singleInstance;
}
}
- 不能排除或捕获泛型类的实例
本文参考:《java核心技术 卷1》