Java 泛型学习笔记

大部分都和C++中一样,主要注意泛型和多态相关的一部分内容

泛型与多态

泛型不具备继承性

import java.util.ArrayList;

public class GenericsDemo {
    public static void main(String[] args) {
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();


        method(list1);
        method(list2);//error
        method(list3);//error
    }

    public static void method(ArrayList<Ye> list){

    }
}


class Ye{};
class Fu extends Ye{};
class Zi extends Fu{};

泛型里面是什么,就得传什么

数据具有继承性

import java.util.ArrayList;

public class GenericsDemo {
    public static void main(String[] args) {
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();


        // method(list1);
        // method(list2);//error
        // method(list3);//error
        list1.add(new Ye());
        list1.add(new Fu());
        list1.add(new Zi());
    }

    public static void method(ArrayList<Ye> list){

    }
}


class Ye{};
class Fu extends Ye{};
class Zi extends Fu{};

这样是可以的

泛型方法

public static<E> void method(ArrayList<E> list) {
    
}

在修饰符后面加入泛型,可以生成泛型方法

弊端:可以接受任意的数据类型

通配符限定范围

  • ?:表示不确定的类型,可以放在泛型里面

例如:

public static void method(ArrayList<?> list) {
    //此时不用在修饰符后面显式标注泛型
}
  • ? extends E:表示可以传递E或者E所有的子类类型
  • ? super E:表示可以传递E或者E所有的父类类型

应用场景

  • 在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口
  • 如果类型不确定,但是之后只能传递某个继承体系里面的,可以使用泛型的通配符
img_show