
Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。使用泛型参数,可以增强代码的可读性以及稳定性。
编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。
比如 ArrayList 这行代码就指明了该 ArrayList 对象只能传入 Persion 对象,如果传入其他类型的对象就会报错。
ArrayList extends AbstractList
并且,原生 List 返回类型是 Object ,需要手动转换类型才能使用,使用泛型后编译器自动转换。
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。
1.泛型类:
- //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
- //在实例化泛型类时,必须指定T的具体类型
- public class Generic
{ -
- private T key;
-
- public Generic(T key) {
- this.key = key;
- }
-
- public T getKey(){
- return key;
- }
- }
如何实例化泛型类:
Generic genericInteger = new Generic(123456);
2.泛型接口 :
- public interface Generator
{ - public T method();
- }
实现泛型接口,不指定类型:
- class GeneratorImpl
implements Generator{ - @Override
- public T method() {
- return null;
- }
- }
实现泛型接口,指定类型:
- class GeneratorImpl
implements Generator{ - @Override
- public String method() {
- return "hello";
- }
- }
3.泛型方法 :
- public static < E > void printArray( E[] inputArray )
- {
- for ( E element : inputArray ){
- System.out.printf( "%s ", element );
- }
- System.out.println();
- }
- // 创建不同类型数组: Integer, Double 和 Character
- Integer[] intArray = { 1, 2, 3 };
- String[] stringArray = { "Hello", "World" };
- printArray( intArray );
- printArray( stringArray );
注意:
public static < E > void printArray( E[] inputArray )一般被称为静态泛型方法;在 java 中泛型只是一个占位符,必须在传递类型后才能使用。类在实例化时才能真正的传递类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数,静态的方法的加载就已经完成了,所以静态泛型方法是没有办法使用类上声明的泛型的。只能使用自己声明的。