泛型程序设计(Generic programming)的魅力所在:编写的代码可以被不同的类型对象所复用。
类型参数的意义:以前没有类型参数的时候ArrayList里面的里面添加不同类型的对象,不会报错,但是你取出的时候需要进行强制类型转换,就会报错,不同的对象需要进行不同的对象的类型转换。有了泛型之后,你添加的类型就可以确认,如果类型不对编译的时候就会报错,泛型是编译时作用,而不是运行时作用。ArrayListfiles=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) }; Pairminmax = Arrayminmax.minmax(birthdays); System.out.println(minmax.getFirst()); System.out.println(minmax.getSecond()); }}class Arrayminmax{ public static Pair minmax(T[] a){ // 是类型参数, Pair 是返回值类型 if(a==null||a.length==0){ return null; } T min = a[0]; T max = a[0]; for (int i = 1; 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{ private static T singleInstance;//error public static getSIngleInstance(){ //error return singleInstance; } }
- 不能排除或捕获泛型类的实例本文参考:《java核心技术 卷1》