1 概念
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是类型参数。
2 泛型方法
2.1 定义与使用
//public <T> 返回类型 method(T arg1,T arg2){}
public <T> stringify(T t){
return JSON.toJSONString(t);
}
public class Test{
public static void main(String[] args) {
new GenericsDemo().stringify(obj);
}
}
3 泛型类
3.1 定义与使用
//public class 类名 <泛型类1,泛型类2,...>{}
public class GenericsDemo <T> {
private T tvar;
}
//在创建对象的时候确定泛型
ArrayList<String> list = new ArrayList<String>()
4 泛型接口
4.1 定义与使用
//修饰符 interface接口名<代表泛型的变量> { }
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
//定义类时确定泛型的类型
public class MyImp1 implements MyGenericInterface<String> {
@Override
public void add(String e) {
@Override
public String getE() { return null;}}
}
//始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public class MyImp2<E> implements MyGenericInterface<E> {
@Override
public void add(E e) {
// 省略...
}
@Override
public E getE() { return null;}
}
//确定泛型
public class GenericInterface {
public static void main(String[] args) {
MyImp2<String> my = new MyImp2<String>();
my.add("aa");
}
5 类型通配符
泛型通配符:当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符表示。
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
- 通配符高级使用:在JAVA的泛型中可以指定一个泛型的上限和下限。
泛型的上限:
- 格式:类型名称 <? extends 类 > 对象名称
- 意义:只能接收该类型及其子类
- 限制,使用的时候只能get
泛型的下限:
- 格式:类型名称 <? super 类 > 对象名称
- 意义:只能接收该类型及其父类型
- 限制,使用时只能set
常用通配符:
7 泛型作用及场景
- 安全性
在没有泛型之前,从集合中读取到的每一个对象都必须进行类型转换,如果不小心插入了错误的类型对象,在运行时的转换处理就会出错。
- 消除转换
消除源代码中的许多强制类型转换,这使得代码更加可读,并且减少了出错机会。
- 提升性能
在非泛型编程中,将筒单类型作为Object传递时会引起Boxing(装箱)和Unboxing(拆箱)操作,这两个过程都是具有很大开销的。引入泛型后,就不必进行Boxing和Unboxing操作了,所以运行效率相对较高,特别在对集合操作非常频繁的系统中,这个特点带来的性能提升更加明显。
- 重用性
泛型本身特性
引用资料
CSDN博主「mikechen的互联网架构」
原文链接:https://blog.csdn.net/ChenRui_yz/article/details/122935621