PDI中使用Janino编译代码遇泛型不支持问题的技术求助
解决Janino编译Hashtable.get返回值无keySet()方法的问题
我之前也踩过Janino处理非泛型集合的这个坑!因为Janino不支持泛型语法,所以Hashtable在它眼里就是存储Object类型的容器,调用hashtable.get("ERROR_2001")返回的默认是Object,自然找不到keySet()方法。
这里给你两个亲测有效的解决办法:
强制类型转换法:直接把
get的返回值强转成你实际存储的集合类型(比如Hashtable或者Map),示例代码如下:// 假设你实际存的是Hashtable类型 Hashtable errorMap = (Hashtable) hashtable.get("ERROR_2001"); Set keySet = errorMap.keySet();为了避免类型转换异常,建议加个类型判断兜底:
Object value = hashtable.get("ERROR_2001"); if (value instanceof Hashtable) { Hashtable errorMap = (Hashtable) value; Set keySet = errorMap.keySet(); // 后续业务逻辑 }使用非泛型声明集合:在初始化
hashtable的时候,直接用非泛型的方式声明,避免Janino对类型产生混淆,比如:Hashtable hashtable = new Hashtable(); Hashtable errorDetails = new Hashtable(); errorDetails.put("code", "2001"); errorDetails.put("msg", "参数错误"); hashtable.put("ERROR_2001", errorDetails);这种方式能让Janino更清晰识别每个值的实际类型,减少不必要的类型转换操作。
另外要提醒下,Janino对Java语法的支持确实比标准编译器弱不少,遇到泛型相关的问题,基本都可以通过显式类型转换或者放弃泛型语法来规避,亲测有效!
内容的提问来源于stack exchange,提问作者PalePal
相关产品推荐
相关产品推荐

