前言
有时候在项目开发过程中,很多可以使用复用的部分。在接下来讲解的泛型泛型进行相对于传统上的形参,可以使我们的参数具有更多类型上的变化,使代码能更好地复用。
什么是泛型?
泛型,即“参数化类型”,在面向对象编程及各种设计模式中有非常广泛的应用。Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
为什么要使用泛型?
操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。
泛型类
泛型类的规则
- 泛型类在类名后面添加了类型参数声明部分。
- 泛型类的类型参数声明部分可以是一个或多个类型参数,参数间用逗号隔开。
泛型类的格式
class GenericsTest<T> { private T t; public void add(T t) { this.t = t; } public T getTest() { return t; } }
泛型接口
定义一个泛型接口 在实现泛型的接口未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中。
public interface Map<K,V> { }
泛型方法
泛型方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
泛型方法的规则
泛型方法的规则如下:
- 所有泛型方法声明都有一个由尖括号分隔类型参数声明部分,该类型参数声明部分在方法返回类型之前。
- 类型参数声明部分可以是一个或多个类型参数,参数间用逗号隔开。
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
- 类型参数只能代表引用型类型。
泛型方法格式
泛型方法格式如下
// 泛型方法 public static < E > void testMethod( E e ){ // 逻辑处理 System.out.println(e); }
下面用一个简单的示例进行介绍。其中printInfo()是一个泛型的方法,其功能是接收到数组参数之后,输出数组的类型,然后将数组中的元素进行按顺序输出到控制台。 其中进行了三个数据类型的数组,分别是int、double、character。 都初始化好之后,调用泛型方法printInfo()输出数组元素。
public static void main(String[] args) { Integer[] intArray = { 1, 2, 3, 4, 5 ,6 }; Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 }; Character[] charArray = { 'J', 'u', 'E', 'J', 'I', 'N' }; printInfo(intArray); printInfo(doubleArray); printInfo(charArray); } public static <E> void printInfo(E[] e){ System.out.println(e.getClass().getTypeName()); for(E e1 :e){ System.out.println(e1); } }
调用泛型方法printInfo()输出数组元素。输出结果如下: