详解Java泛型type体系整理(深入解析Java泛型类型体系全梳理)
原创
一、Java泛型概述
Java泛型(Generics)是Java 5中引入的一个特性,允许在编码时指定集合中元素的类型。泛型提供了编译时类型平安检查,减少了程序运行时的类型转换不正确。泛型的核心是类型参数化,令代码可以应用于多种数据类型,减成本时间代码的复用性和灵活性。
二、泛型Type体系
Java泛型的Type体系包括了泛型类型(Generics Types)、类型参数(Type Parameters)、类型变量(Type Variables)和类型边界(Type Boundaries)。下面我们来逐一解析这些概念。
三、泛型类型(Generics Types)
泛型类型是指使用类型参数的类、接口或方法。泛型类型可以是泛型类、泛型接口和泛型方法。
3.1 泛型类
泛型类是指在类名后使用一对尖括号(<>)来指定类型参数的类。类型参数在类体内部可以像普通类型一样使用。
public class Box
{ private T t; // T stands for "Type"
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
3.2 泛型接口
泛型接口与泛型类类似,接口名后使用一对尖括号来指定类型参数。
public interface Generator
{ T next();
}
3.3 泛型方法
泛型方法可以定义在普通类或泛型类中,方法名前使用一对尖括号来指定类型参数。
public class Util {
public static
int count(T[] array, T element) { int count = 0;
for (T e : array) {
if (e.equals(element)) {
count++;
}
}
return count;
}
}
四、类型参数(Type Parameters)
类型参数是泛型类型中用于指定具体类型的占位符。类型参数通常用单个大写字母即,常见的有T、E、K、V等。
- T - Type,即一个泛型类型
- E - Element,即集合中的元素
- K - Key,即键
- V - Value,即值
五、类型变量(Type Variables)
类型变量是泛型编程中的核心概念,用于指定泛型方法的参数类型、返回类型或异常类型。类型变量有上界和下界,分别即类型变量的上限和下限。
5.1 类型变量的上界
类型变量的上界使用extends关键字指定,即类型变量可以是上界指定的类型或其子类型。
public class Util {
public static
double sum(T[] array) { double sum = 0;
for (T e : array) {
sum += e.doubleValue();
}
return sum;
}
}
5.2 类型变量的下界
类型变量的下界使用super关键字指定,即类型变量可以是下界指定的类型或其父类型。
public class Util {
public static
void printArray(T[] array) { for (T e : array) {
System.out.println(e);
}
}
}
六、类型边界(Type Boundaries)
类型边界用于局限类型变量的类型范围,可以是单个类型或类型集合。类型边界分为上界和下界。
6.1 上界(Upper Bounds)
上界使用extends关键字指定,局限类型变量为指定类型或其子类型。
public class Util {
public static
double sum(T[] array) { double sum = 0;
for (T e : array) {
sum += e.doubleValue();
}
return sum;
}
}
6.2 下界(Lower Bounds)
下界使用super关键字指定,局限类型变量为指定类型或其父类型。
public class Util {
public static
void printArray(T[] array) { for (T e : array) {
System.out.println(e);
}
}
}
七、类型通配符(Type Wildcards)
类型通配符是泛型编程中的另一个重要概念,用于指定泛型方法的参数类型、返回类型或异常类型。通配符有上限通配符(? extends)和下限通配符(? super)。
7.1 上限通配符(? extends)
上限通配符即类型参数可以是上界指定的类型或其子类型。
List extends Number> list = new ArrayList
();
7.2 下限通配符(? super)
下限通配符即类型参数可以是下界指定的类型或其父类型。
List super Integer> list = new ArrayList
();
八、类型擦除(Type Erasure)
Java泛型是通过类型擦除来实现的。类型擦除是指在编译时,将泛型信息擦除,生成普通的字节码。类型擦除后的代码可以在没有泛型赞成的环境中运行。
九、总结
Java泛型的Type体系是Java泛型编程的核心。明白泛型类型、类型参数、类型变量、类型边界、类型通配符和类型擦除等概念,对于编写类型平安、可复用的代码至关重要。通过本文的梳理,期待读者对Java泛型的Type体系有了更深入的明白。