当前位置: 首页 > Java > 正文

无法确定 T 的类型参数异常解决

1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

今天在用maven编译程序时报一下错误:
D:\**\common\util\XmlSerializableTool.java:[80,42] 无法确定 T 的类型参数;对于上限为 T,java.lang.Object 的类型变量 T,不存在唯一最大实例

代码为:

 
@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技术精华网

无法确定 T 的类型参数异常解决:等您坐沙发呢!

发表评论