【发布时间】: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<Object> type以解决擦除问题。如果您确实需要它,那么正确添加它也可以解决问题,并且是解决问题的首选方法。 -
你
extend JsonProvider<Object>吗? -
您的
RootlessJsonProvider也应该是通用的,并将其类型传递给JSONProvider。public class RootlessJsonProvider<T> extends JSONProvider<T>。这样该方法可以保留类型签名。
标签: java json generics inheritance type-erasure