Java基础-泛型

53 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

泛型_基本概念_使用方式

Collection<String> strList = new ArrayList<String>();//JDK7以前,必须这样写
JDK7以后,可以:
Collection<String> strList = new ArrayList<>();·
或者
Collection<String> strList = new ArrayList();//编译通过,但会有警告。

注意:

1.泛型和集合没有关系,只是集合是可以使用泛型的。其它类也可以使用泛型(在使用时,可以指定泛型)

2.不是所有类都可以使用泛型,要求类的定义中,必须声明支持泛型才可以。(下面我们会讲到泛型类的定义)

3.泛型必须是"引用类型",不能是基本类型:

ArrayList<int> intList;//编译错误
ArrayList<Integer> intList = new ....;//OK的
intList.add(10);//自动装箱

泛型_泛型的优点

优点:强制集合中只能存储一种类型的引用,方便后期使用,避免的由于类型转换错误而引发的异常,提高程序的健壮性。

将后期由于转换错误导致的"运行时异常",提前到了编译期。

泛型_泛型类的定义

public class Student<T>{
    public void show(T t){
    }
}

1).类名后就是"泛型定义":它表示这个类可以支持泛型,构造的时候可以指定泛型,另外此类内部也可以使用这个类型.

2).语法规则:

1).T是泛型名,泛型名称可以是:大写字母(常用)、小写字母、一个字母、多个字母
    public class Student<t>{

    }
2).可以同时定义多个泛型名称,中间用逗号隔开;
    public class Student<T,K,V>{

    }

注意:构造此类对象时,可以不指定具体类型,但如果指定,必须三个全部指定。

3).如果类定义时支持泛型,在构造对象时,可以不指定泛型:

Student stu = new Student();
stu.show(Object);//使用时,方法内使用泛型的位置全部变为Object类型

4).泛型:只存在于编译期,编译后,在class文件中是没有"泛型"的。

泛型_泛型方法的定义

public void Student{
    public <T> ArrayList<T> show(T s1 ,T s2,T s3,T s4,T s5){//定义了一个支持泛型的方法
        ArrayList<T> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);

        return list;
    }
}

使用:

public static void main(String[] args) {
    Student stu = new Student();
    ArrayList<String> strList = stu.<String>show("a","b","c","c","aa");
    ArrayList<Integer> intList = stu.<Integer>show(10,20,30,40,50);

}

泛型_泛型接口的定义

interface IA<T>{
    public void show(T t);
}

子类实现具有泛型接口的时候,怎样处理泛型部分?

子类:

1.可以丢弃泛型【以后会看到这种情况】

class SubClass implements IA{
    @Override
    public void show(Object t) {//方法中使用泛型的位置全部变为Object类型       
    }

}

2.可以指定为某个具体类型【以后会看到这种情况】

class SubClass2 implements IA<String>{//指定为String类型
    @Override
    public void show(String t) {//重写时,必须是String类型
    }
}

3.继续继承泛型【最常用】

class SubClass3<T> implements IA<T>{
    @Override
    public void show(T t) {
    }
}

泛型_泛型通配符

1).<?> : 统配任何类型:具有任何类型泛型的集合

    class Demo{
        public static void main(String[] args){
        }
        public static void show(ArrayList<?> list){//表示:可以接收具有任何泛型的ArrayList引用
        }
    }

2).<? extends E>:通配所有的E类型以及E的所有子类类型的泛型

    public static void main(String[] args){
        ArrayList<String> strList = new ArrayList<>();
        ArrayList<Integer> intList = new ArrayList<>();
        ArrayList list = new ArrayList();
        ArrayList<Object> objList = new ArrayList<>();

        show(strList);//OK的
        show(intList);//OK的
        show(list);   //OK的
        show(objList);//OK的
    }
    public static void show(ArrayList<? extends Object> list){//注意:如果写为show(ArrayList<Object> objList)错误的
    }

3).<? super E>:通配所有的E类型以及E的父类的类型的泛型;

    class A{}
    class B extends A{}
    class B1 extends B{}
    class B2 extends B{}
    ...
    main(){
        ArrayList<A> list1 = new ArrayList<>();
        ArrayList<B> list2 = new ArrayList<>();
        ArrayList<B1> list3 = new ArrayList<>();
        ArrayList<B2> list4 = new ArrayList<>();

        show(list1);//Ok的
        show(list2);//OK的
        show(list3);//OK的
        show(list4);//错误

    }
    public static void show(ArrayList<? super B1> list){
    }