JAVA泛型学习笔记

213 阅读2分钟

在java中总能看到这样的代码,什么T\E\V看着都让人迷糊,所以特地去学了下泛型,以此篇作为记录

image.png

泛型概述


泛型介绍

泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

泛型的好处

  1. 把运行时期的问题提前到了编译期间
  2. 避免了强制类型转换

泛型的格式

  1. <类型>: 指定一种类型的格式.尖括号里面可以任意书写,一般只写一个字母.例如: V
  2. <类型1,类型2…>: 指定多种类型的格式,多种类型之间用逗号隔开.例如:<K,V>

泛型类


定义格式

修饰符 class 类名<类型>{ }

示例代码

public class Generic<T> {
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}

测试类

class GenericTest {
    public static void main(String[] args) {
        Generic<String> stringGeneric = new Generic<>();
        stringGeneric.setT("青衫");
        System.out.println(stringGeneric.getT());
        Generic<Integer> integerGeneric = new Generic<>();
        integerGeneric.setT(22);
        System.out.println(integerGeneric.getT());
    }
}

output: 青衫 22

泛型方法


定义格式

修饰符 <类型> 返回值类型 `方法名`(类型 变量名){}

示例代码

public <T> void getValue(T t){
    System.out.println(t);
}

泛型接口


定义格式

修饰符 interface 接口名<类型>{}

实例代码

泛型接口

public interface GenericInterface<T>  {
    void getValue(T t);
}

泛型接口实现类1

定义实现类时,定义和接口相同泛型,创建实现类对象时明确泛型的具体类型

class GenericInterfaceImpl<T> implements GenericInterface<T>{
    @Override
    public void getValue(T t) {
        System.out.println(t);
    }
}

泛型接口实现类2

定义实现类时,直接明确泛型的具体类型

class GenericInterfaceImpl2 implements GenericInterface<Integer>{
    @Override
    public void getValue(Integer integer) {
        System.out.println(integer);
    }
}

类型通配符


类型通配符:<?>

  1. ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
  2. 但是并不能把元素添加到ArrayList中了,获取出来也是父类类型

类型通配符上限:<? extends 类型>

  • ArrayList<? extends Number>: 它表示的类型是Number或者其子类型

类型通配符上限:<? super 类型>

  • ArrayList<? super Number>: 它表示的类型是Number或者其父类型

泛型通配符的使用

public class GenericAllInTest {
    public static void main(String[] args) {
        ArrayList<String> a1 = new ArrayList<>();
        ArrayList<Integer> a2 = new ArrayList<>();
        ArrayList<Number> a3 = new ArrayList<>();
        ArrayList<Object> a4 = new ArrayList<>();
        // test method01
        method01(a1);
        method01(a2);
        method01(a3);
        method01(a4);
        // test method02
        method02(a1);// error
        method02(a2);
        method02(a3);
        method02(a4);// error
        // test method03
        method03(a1);// error
        method03(a2);// error
        method03(a3);
        method03(a4);
    }
    // 泛型通配符:此时的泛型?表示泛型可以是任意类型
    public static void method01(ArrayList<?> a){}
    // 泛型通配符上限:此时的泛型?表示泛型必须是Number或Number类型的子类
    public static void method02(ArrayList<? extends Number> a){}
    // 泛型通配符上限:此时的泛型?表示泛型必须是Number或Number类型的父类
    public static void method03(ArrayList<? super Number> a){}
}

不积跬步无以至千里,不积小流无以成江海。