Java中泛型

泛型

① 集合接口或集合类在jdk5.0时都修改为带泛型的结构。

② 在实例化集合类时,可以指明具体的泛型类型

③ 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。比如:add(E e) --->实例化以后:add(Integer e)

④ 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换

⑤ 如果实例化时,没有指明泛型的类型。默认类型为java.lang.Object类型。

自定义泛型类,泛型接口

如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型

如果子类在继承带泛型的父类时,指明了泛型类型。则实例化子类对象时,不再需要指明泛型。

静态方法中不能使用类的泛型。

异常类不能是泛型的。

泛型方法

泛型方法:在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系。换句话说,泛型方法所属的类是不是泛型类都没有关系。
泛型方法,可以声明为静态的。原因:泛型参数是在调用方法时确定的。并非在实例化类时确定。

	public static <E>  List<E> copyFromArrayToList(E[] arr){

        ArrayList<E> list = new ArrayList<>();

        for(E e : arr){
            list.add(e);
        }
        return list;

    }
  1. 泛型在继承方面的体现

虽然类A是类B的父类,但是G 和G二者不具备子父类关系,二者是并列关系。

补充:类A是类B的父类,A 是 B 的父类

  1. 通配符的使用
    通配符:?

    类A是类B的父类,G和G是没有关系的,二者共同的父类是:G<?>

        public void print(List<?> list){
            Iterator<?> iterator = list.iterator();
            while(iterator.hasNext()){
                Object obj = iterator.next();
                System.out.println(obj);
            }
        }
    

    添加(写入):对于List<?>就不能向其内部添加数据。除了添加null之外。

    获取(读取):允许读取数据,读取的数据类型为Object

3.有限制条件的通配符的使用。
? extends A:
G<? extends A> 可以作为G
和G的父类,其中B是A的子类

​ ? super A:
​ G<? super A> 可以作为G
和G的父类,其中B是A的父类

        List<? extends Person> list1 = null;
        List<? super Person> list2 = null;

        List<Student> list3 = new ArrayList<Student>();
        List<Person> list4 = new ArrayList<Person>();
        List<Object> list5 = new ArrayList<Object>();

        list1 = list3;
        list1 = list4;
//        list1 = list5;

//        list2 = list3;
        list2 = list4;
        list2 = list5;

//写入数据:
        //编译不通过
//        list1.add(new Student());

        //编译通过
        list2.add(new Person());
        list2.add(new Student());
posted @ 2021-10-06 12:58  hugeBlair  阅读(92)  评论(0)    收藏  举报