java泛型的理解

泛型程序设计(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》
原文地址:https://www.cnblogs.com/narojay/p/10812602.html