java中的泛型

泛型是jdk1.5引入的特性,本质是参数化类型,可以很好的降低代码重复度,安全又简单.

泛型解决了编码过程中需要显式强制转换的情况,可以在编译期间进行类型检查,通过自动且隐式的强制转换,降低代码复杂度.

泛型的实现原理:类型擦除.编译时会将泛型擦除,使用其限定类型(未限定的则用Object)的第一个边界类型代替(如T extends Comparable & Serializable则会是Comparable).

基本语法:泛型类在类名后,泛型方法/接口在返回值前通过尖括号标记

举例

package temp;

import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

public class GenericityTypeTest {
    /**
     * 泛型可以是一个或多个,一般通过首字母进行大写,如List<E>中是指element<br/>
     * 泛型可以指定父类或绑定接口,如U继承自Object,I实现Serializable接口
     */
    @ToString
    public static class GenericityType1<T, U extends Object, I extends Serializable> {
        @Getter
        @Setter
        private T t;
        private U u;
    }

    /**
     * 支持多个绑定
     */
    @ToString
    public static class GenericityType3<T, U extends Object & Serializable> {
        @Getter
        @Setter
        private T t;
        private U u;
    }

    /**
     * 泛型通配符?,不限定边界
     */
    public static void test1() {
        GenericityType3<?, ?> genericityType2 = new GenericityType3<Integer, String>();
        System.out.println(genericityType2);
    }

    /**
     * 泛型通配符super 限定父类
     */
    public static void test2() {
        GenericityType3<?, ? super Integer> genericityType2 = new GenericityType3<Integer, Number>();
        System.out.println(genericityType2);
    }

    /**
     * 泛型的定义在返回值前面,使用尖括号括起来
     * 
     * @param t void
     */
    public static <T> void test(T t) {
        System.out.println(t);
    }

}