修复"具有相同的删除...但不覆盖"对于具有相同方法签名但是新实现的子类?

时间:2016-04-06 22:01:36

标签: java json generics inheritance type-erasure

在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的一部分

1 个答案:

答案 0 :(得分: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<>(...);