基础概念

定义

  • 泛型类定义时,不指定具体类型。
  • 实例化对象时,指定具体类型,若不指定,默认Object类型
  • 具体类型不支持基础数据类型

    常用类型

    T、E、K、V

    解决的问题

  • 解决编译时的模糊类型

  • 减少数据类型转换

    泛型使用

    泛型子类

  • 泛型子类对象与父类泛型相同

  • 非泛型子类,则父类也需要指定具体类型

    泛型接口

  • 泛型接口继承泛型接口,与接口类类型一致,可进行泛型扩充

  • 非泛型接口实现泛型接口需指定类型

    1. //父类
    2. public class Parent<T>{
    3. private T key;
    4. public Parent(T key){
    5. this.key=key;
    6. }
    7. public T getKey(){
    8. return key;
    9. }
    10. }
    11. //子类
    12. public class Child<T,E> implements Parent<T>{
    13. private T key;
    14. private E value;
    15. public Child(T key,E value){
    16. this.key=key;
    17. this.value=value;
    18. }
    19. public T getKey(){
    20. return key;
    21. }
    22. }

    泛型方法

    1. //参数和返回值中使用的泛型,需要在前面的泛型列表中<E>
    2. public <E> E getNewValue(List<E> e){
    3. return null;
    4. }

    类型通配符

  • 使用”?”代表泛型参数

    1. //设置类型通配符上限边界
    2. public void getFirstNumber(List<? extends Number> list){
    3. Number num = list.get(0);
    4. System.out.println(num);
    5. }
    6. //设置类型通配符下限边界
    7. public void getFirstNumber(List<? super Number> list){
    8. Number num = list.get(0);
    9. System.out.println(num);
    10. }

    类型擦除

  • 在转换为字节码文件时,会擦除泛型类型为Object等

    泛型数组

    1. //方法一
    2. ArrayList<String>[] intList = new ArrayList[5];
    3. //方法二
    4. public class Fruit<T>{
    5. private T[] array;
    6. public Fruit(Class<?> clz,int length){
    7. array = (T[])Array.newInstance(clz,length);
    8. }
    9. }
    10. Fruit<String> fruit = new Fruit<>(String.class,3);