前言
泛型(generics),即“参数化类型”。是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是为了参数化类型,也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
Java泛型中的标记符含义
- E - Element (在集合中使用,因为集合中存放的是元素)
- T - Type(Java 类)
- K - Key(键)
- V - Value(值)
- N - Number(数值类型)
- ? - 不确定Java类型(无界通配符)
Java泛型的应用
-
泛型类
public class GenericsClass<T>{}public class GenericsClass<K,V>{} -
泛型方法
public <T> T GenericsMethod(T t){} -
?通配符-
上限通配符 < ? 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);//编译出错,未知的类型,不能写入
-
-
?和T的区别T是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。