无法确定 T 的类型参数异常解决
今天在用maven编译程序时报一下错误:
D:\**\common\util\XmlSerializableTool.java:[80,42] 无法确定
代码为:
@SuppressWarnings("unchecked") public static <T> T deSerializeXML(Class<T> className, String xml, boolean flag) { try { return deSerializeXMLByDom(className, xml, flag); } catch (Throwable t) { LOG.error("XmlSerializableTool.deSerializeXML.error | " + xml, t); deserializeHolder.remove(); try { return deSerializeXMLByXpp(className, xml, flag); } finally { deserializeHolder.remove(); } } } /** * * 使用Dom进行解析 * @param className * @param xml * @param flag * @return * @return T */ @SuppressWarnings("unchecked") private static <T> T deSerializeXMLByDom(Class<T> className, String xml, boolean flag) { XStream xStreamDeserialize = deserializeHolder.get(); if (xStreamDeserialize == null) { xStreamDeserialize = new XStream(new DomDriver()); xStreamDeserialize.registerConverter(new OrderBigDecimalConverter()); deserializeHolder.set(xStreamDeserialize); } /** 如果有标注,则类别用用标注, 如果没有则用类名 */ XStreamAlias annotation = className.getAnnotation(XStreamAlias.class); if (annotation != null && annotation.value() != null) { xStreamDeserialize.alias(annotation.value(), className); } xStreamDeserialize.alias(className.getSimpleName(), className); xStreamDeserialize.processAnnotations(className); if (flag) { xStreamDeserialize.autodetectAnnotations(true); } return (T) xStreamDeserialize.fromXML(xml); } /** * * 使用Xpp3进行解析 * 避免&#;等特殊字符报错 * @param type * @param xmlObj * @param flag * @return * @return T */ @SuppressWarnings("unchecked") private static <T> T deSerializeXMLByXpp(Class<?> type, String xmlObj, boolean flag) { XStream xStreamDeserialize = deserializeHolder.get(); if (xStreamDeserialize == null) { xStreamDeserialize = new XStream(new Xpp3Driver()) { protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { @SuppressWarnings("rawtypes") public boolean shouldSerializeMember(Class definedIn, String fieldName) { try { return definedIn != Object.class || realClass(fieldName) != null; } catch (CannotResolveClassException cnrce) { LOG.error("Xpp3Driver.shouldSerializeMember.error", cnrce); return false; } } }; } }; xStreamDeserialize.registerConverter(new OrderBigDecimalConverter()); deserializeHolder.set(xStreamDeserialize); } /** 如果有标注,则类别用用标注, 如果没有则用类名 */ XStreamAlias annotation = type.getAnnotation(XStreamAlias.class); if (annotation != null && annotation.value() != null) { xStreamDeserialize.alias(annotation.value(), type); } xStreamDeserialize.alias(type.getSimpleName(), type); xStreamDeserialize.processAnnotations(type); if (flag) { xStreamDeserialize.autodetectAnnotations(true); } return (T) xStreamDeserialize.fromXML(xmlObj); } |
把返回类型强制转换为T即可。
@SuppressWarnings("unchecked") public static <T> T deSerializeXML(Class<T> className, String xml, boolean flag) { try { return (T)deSerializeXMLByDom(className, xml, flag); } catch (Throwable t) { LOG.error("XmlSerializableTool.deSerializeXML.error | " + xml, t); deserializeHolder.remove(); try { return (T)deSerializeXMLByXpp(className, xml, flag); } finally { deserializeHolder.remove(); } } } |
问题原因:
用Maven编译,jdk版本已经指定为1.6版,本地jdk版本是jdk1.6.0_23版本,经过查找相关资料确认,该问题是jdk1.6.0_16版本一个bug导致的,这是一个确认的错误:错误号:6468354,具体错误原因可以查看:https://bugs.openjdk.java.net/browse/JDK-6468354
1. 在返回的地方加强制类型转换,可以临时绕过该问题
2.升级jdk版本到1.6的最新版本,比如我们升级到jdk1.6.0_38版本后,测试打包就没有问题。根据网上资料,该bug在jdk1.6.0_25版本已经解决
本文固定链接: http://www.chepoo.com/unable-to-determine-t-type-parameter-abnormal-solve.html | IT技术精华网