java泛型之T,E,K,V,?

961 阅读2分钟

前言

泛型(generics),即“参数化类型”。是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是为了参数化类型,也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

Java泛型中的标记符含义

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • ? - 不确定Java类型(无界通配符)

Java泛型的应用

  1. 泛型类

    public class GenericsClass<T>{}
    
    public class GenericsClass<K,V>{}
    
  2. 泛型方法

    public <T> T GenericsMethod(T t){}
    
  3. ?通配符

    • 上限通配符 < ? extends E>

      extends 关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。

      例如,方法接口可以接收父类Fruits和他的子类

      //水果
      @Data
      public class Fruits{
          private String name;
          private Double price;
      }
      //打印水果,只可以打印Fruits
      public static void print(List<Fruits> fruits){
          Iterator<Fruits> iterator = fruits.iterator();
      		while(iterator.hasNext()){
      			System.out.println(iterator.next();
      		}
      }
      //打印水果,可以打印Fruits和它的子类
      public static void print(List<? extends Fruits> all){
          Iterator<? extends Fruits> iterator = all.iterator();
      		while(iterator.hasNext()){
      			System.out.println(iterator.next());
      		}
      }
      
    • 下限通配符 < ? super E>

      super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object

      例如:

      List<Integer> integers = new ArrayList<Integer>(1);
      List<? super Integer> superIntegers = integers;//编译通过
      
    • 无限通配符<?>

      单独的<?>本质是<? extends Object>,表示不知道什么类型,只能读取,不能写入

      例如:

      List<Integer> integers = new ArrayList<Integer>(2);
      integers.add(1);
      integers.add(2);
      List<?> superIntegers = integers;//编译通过
      superIntegers.add(3);//编译出错,未知的类型,不能写入
      
  4. ?T的区别

    T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法