java范型的理解

1.概念
java中类型的参数化,用一个变量来表示某种类型。

2.引入泛型解决的问题
<1>在编译期间进行类型检查,避免出现classCastException(类型转换异常)
<2>避免进行强制类型转换
<3>避免重复代码的编写,实现复用。

3.泛型在集合类中的的应用
对于ArrayList:
不使用泛型时,此时默认是Object类型:

public class Test1 {
    public static void main(String[] args) {
        ArrayList a1=new ArrayList();
        a1.add("hll");
        a1.add(1);
        String s=(String)a1.get(0);
        String s2=(String)a1.get(1);//在运行时会出现类型转换异常

    }

}

上述代码进行了强制类型转换,且在编译期间不会出现类型转换异常,在运行时会出现类型转换异常
添加泛型后:

ArrayList<String> a1=new ArrayList<String>();
        a1.add("hll");
        a1.add(1);//编译时就会报错
        String s=a1.get(0);//不必进行强制类型转换

4.自定义泛型类

public class Test1<T extends Comparable> {

    public int CompareTo(T a,T b){
        return a.compareTo(b);

    }
    public static void main(String[] args) {
        Test1 t=new Test1();
        System.out.println(t.CompareTo(1,3));

    }


}

类型擦除:在执行的过程中,会去掉泛型的类型,用确定的类型来代替。如上面的比较大小的代码,T最后会用Comparable代替,类型擦除后的代码为:

public class Test1{

    public int CompareTo(Comparable a,Comparable b){
        return a.compareTo(b);

    }
    public static void main(String[] args) {
        Test1 t=new Test1();
        System.out.println(t.CompareTo(1,3));

    }


}

泛型注意的几点

1.泛型的类型不能用基本类型代替,例如:
ArrayList<int> s=new ArrayList<int>();是错误的写法

2.泛型间父子继承关系,例如
ArrayList<Object> t=new ArrayList<Integer>();是错误的写法
泛型定义前后必须统一一致

原文地址:https://www.cnblogs.com/wangxiaopei/p/8551196.html