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);
}
}