【问题标题】:Fixing "has the same erasure as..but does not override" for subclass w/ same method signature but new implementation?为具有相同方法签名但新实现的子类修复“与..具有相同的擦除但不覆盖”?
【发布时间】:2016-04-06 22:01:36
【问题描述】:

在 java 中,我有一个将 JsonProvider.java 扩展为 RootlessJsonProvider.java 的类,它允许该类在没有根元素的情况下使用 JSON。

我正在尝试覆盖方法 readFrom,它仍然使用与实现它的类完全相同的方法签名来定义:

    @Override
    public Object readFrom(final Class<Object> type, final Type genericType,
            final Annotation[] anns, final MediaType mtype,
            final MultivaluedMap<String, String> headers,
            final InputStream inputStream) {

        InputStream inputStreamNew = null;

        if (type != null) {
            final XmlRootElement rootElement = type
                    .getAnnotation(XmlRootElement.class);
            if (rootElement != null) {
                inputStreamNew = transformStreamForDropRootElement(rootElement,
                        inputStream);
            }
        }

        return super.readFrom(type, genericType, anns, mtype,
                headers, inputStreamNew);
    }

但改变的只是实现,允许无根 json 使用。

随之而来的错误是:

The method readFrom(Class<Object>, Type, Annotation[], MediaType, MultivaluedMap<String,String>, InputStream) of type RootlessJsonProvider has the same erasure as readFrom(Class, Type, Annotation[], MediaType, MultivaluedMap, InputStream) of type MessageBodyReader but does not override it

更改方法名称也不起作用,因为它的用法不在实现范围内。

JsonProvider rootlessProvier = new RootlessJsonProvder();

rootlessProvider.rootlessReadFrom(....); //ERROR <---- this method doesn't exist as it's not defined in JsonProvider.java

根据该方法的使用方式,没有任何参数不那么通用,那么我该如何解决这个错误?

编辑:

JsonProvider.java

cxf-jaxrs 3.1.5 版的一部分

【问题讨论】:

  • 查看JsonProvider,我没有看到任何readFrom(...) 方法可以覆盖。你用的是什么库?
  • CXF-JAXRS:包 org.apache.cxf.jaxrs.provider。版本 3.1.5
  • 有什么理由没有为类保留泛型类型参数?我相信如果您不需要它,那么第一个参数将变为 Class type 而不是 Class&lt;Object&gt; type 以解决擦除问题。如果您确实需要它,那么正确添加它也可以解决问题,并且是解决问题的首选方法。
  • extend JsonProvider&lt;Object&gt;吗?
  • 您的RootlessJsonProvider 也应该是通用的,并将其类型传递给JSONProviderpublic class RootlessJsonProvider&lt;T&gt; extends JSONProvider&lt;T&gt;。这样该方法可以保留类型签名。

标签: java json generics inheritance type-erasure


【解决方案1】:

函数签名是

class JsonProvider<T> {
    T readFrom(Class<T> ...) {
    }
}

你需要正确地扩展类。

class RootlessJsonProvider extends JsonProvider<SomeClassOfOurs> {
    @Override
    SomeClassOfOurs readFrom(Class<SomeClassOfOurs> ...) {
    }
}

JsonProvider<SomeClassOfOurs> rootlessProvider = new RootlessJsonProvider(...);

或者,

class RootlessJsonProvider<T> extends JsonProvider<T> {
    @Override
    T readFrom(Class<T> ...) {
    }
}

JsonProvider<SomeClassOfOurs> rootlessProvider = new RootlessJsonProvider<>(...);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多