当我们解析 json 时, 期望通过参数传入目标类, 得到返回值对象类型就是目标类的类型, 从而省掉类型转换的操作, 这时就可以利用泛型
/**
* 方法上泛型的语法:
* 在返回值前面使用尖括号, 里面是泛型, 表示某个类型
* 这里方法参数是 Class<T> 返回值是 T, 表示传入某个类对象, 返回值可以拿到该类的实例对象
*/
public static <T> T parse(String text, Class<T> clazz) {
try {
return JSON.parseObject(text, clazz);
} catch (Exception e) {
log.error("json 解析出错: {}", text);
log.error(e.getMessage(), e);
return null;
}
}
其他泛型常识
- 泛型可以声明在接口 / 类 / 方法上
- 声明在类上后, 实例方法可以直接使用泛型无需再次声明, 不过类方法不能使用类上的泛型, 需要每次自己手动声明泛型
- 泛型出现在编译期, 好处是减少强制类型转换和提升阅读性
- 泛型可以限定于某个类 / 接口的父类 / 子类, 例如
<E extends DemoData>
表示继承 / 实现DemoData
的类才能编译通过;<E super DemoData>
表示子类 / 子接口是DemoData
的类才能编译通过 - 泛型有通配符
<?>
, 这种数据取到默认都是Object
类型