什么是泛型
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的参数类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(如T,E)。
泛型方法
泛型方法能够在调用时接收不同的参数类型,根据传递给泛型方法的参数类型,合适的进行方法调用。
举个例子,淘宝SDK调用时,请求的处理过程封装如下
public interface TaobaoClient {
<T extends TaobaoResponse> T execute(TaobaoRequest<T> var1) throws ApiException;
<T extends TaobaoResponse> T execute(TaobaoRequest<T> var1, String var2) throws ApiException;
}
此时T代表了一个继承自TaobaoResponse的子类,也就是SDK中指定的Reponse类,限定了开发者使用SDK中的类
泛型类
泛型类的声明和泛型方法类似,类名后需接上泛型参数,代表不同的参数类型。如图所示
public class Test<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
//todo: 限定了类型为Integer
Test<Integer> test = new Test<>();
test.add(1);
}
}
上面限定了test实例变量接收的类型为Integer,如果开发者add方法中写入String类型,会报错,提供了类型安全的检测机制
类型通配符
- 无界通配符:
?, List<?> 相当于传入的实参只要是个Object对象即可 - 上界通配符:
? extends T表示传入的实参必须为T类型的子类 - 下界通配符:
? super T表示传入的实参必须为T类型的父类
泛型原理-类型擦除
Java中的泛型都是在编译器层面的实现,在生成的字节码中是不包含泛型中的类型参数的。 使用泛型时指定的类型参数,会被编译器在编译的时候去掉,这个过程就是类型擦除。
List<Object>和 List<String>等类型,在编译之后都会变成 List。JVM 看到的只是 List,而由泛型附加的类型信息对 JVM 来说是不可见的。类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。具体规则可以参考上文的类型通配符说明。
这个具体类一般是 Object。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换
成具体的类。
本文标题:Java中的泛型
本文链接:https://blog.quwenai.cn/post/9101.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。






还没有评论,来说两句吧...