机缘巧合下认识的TypeReference

149 阅读1分钟

起因

因为一次测试环境的事故,发现用JSON.parseObject 转换map的时候,没有按照我规定的泛型去转换,就导致我用的时候出现了ClassCastException

Map<String, String> dataMap = JSON.parseObject(jsonString, Map.class);

解决方案

使用阿里巴巴的fastjson中的反序列化框架TypeReference `

Map<String, String> dataMap = JSON.parseObject(jsonString, new TypeReference<Map<String, String>>(){});

`

从这次事故中学习到了什么

parseObject在进行类型转换的时候无法精确转换为需要的类型 这种时候需要使用TypeReference

TypeReference是什么

TypeReference是阿里巴巴fastjson下的一个反序列化框架,字面意思是指Type的Reference,也就是某类型的一个指向或者引用

TypeReference的方法

无参构造

protected TypeReference() {
    // 当前class的父类的type
    Type superClass = this.getClass().getGenericSuperclass();
    // 父类class的泛型数组,也就是实际的type
    Type type = ((ParameterizedType)superClass).getActualTypeArguments()[0];
    Type cachedType = (Type)classTypeCache.get(type);
    if (cachedType == null) {
        classTypeCache.putIfAbsent(type, type);
        cachedType = (Type)classTypeCache.get(type);
    }

    this.type = cachedType;
}

有参构造

按指定类型返回泛型数组