Java通过泛型动态类型强转

前言

现有一个需求,封装一个方法,将Object转换成任意对象

如下,本文采用JSON字符串作为例子:

{
          
   
  "result": [
    {
          
   
      "waypointIndex": 0,
      "imageId": "xxxx.jpg"
    }
  ],
  "isSuccess": true
}

通过JSONPath 利用OQL语法 可解析深层对象

传统方式

public static String jsonData = "{"isSuccess": true,"result": [{"imageId": "xxxx.jpg","waypointIndex": 0}]}";

public Object getObj(String key){
          
   
	JSONObject jsonObject = JSONObject.parseObject(jsonData);
	return JSONPath.eval(jsonObject, key);
}

@Test
public void test() {
          
   
    boolean isSuccess = (Boolean)getObj("$.isSuccess");
    JSONObject jsonObject = (JSONObject)getObj("$");
    List<JSONObject> list = (List<JSONObject>)getObj("result");
    System.out.println(isSuccess);
    System.out.println(jsonObject);
    System.out.println(list);
}

打印输出

true
{"result":[{"waypointIndex":0,"imageId":"xxxx.jpg"}],"isSuccess":true}
[{"waypointIndex":0,"imageId":"xxxx.jpg"}]

通过Java动态泛型

这种方式节省了代码,想要即所得,在封装轮子中使用较多。并且得到得结果也是一样的。

public <T> T getGenericObj(String key){
          
   
    JSONObject jsonObject = JSONObject.parseObject(jsonData);
    return (T)JSONPath.eval(jsonObject, key);
}

/**
 * 通过Java动态泛型
 */
@Test
public void testGeneric() {
          
   
    boolean isSuccess = getGenericObj("$.isSuccess");
    JSONObject jsonObject = getGenericObj("$");
    List<JSONObject> list = getGenericObj("result");
    System.out.println(isSuccess);
    System.out.println(jsonObject);
    System.out.println(list);
    // 写错类型
    String success = getGenericObj("$.isSuccess");
}

打印输出

true
{"result":[{"waypointIndex":0,"imageId":"xxxx.jpg"}],"isSuccess":true}
[{"waypointIndex":0,"imageId":"xxxx.jpg"}]

java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String

写错类型的影响,会报 强制转换异常(java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String) 当然这种常见下,你不确定是什么类型,可以使用Object,如果你提前知道是什么类型,用这种方式还是挺方便的

经验分享 程序员 微信小程序 职场和发展