2016-04-06 1 views
-1

В 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 

Там нет никаких параметров, основываясь на том, как этот метод используется, что меньше общего типа, так как я могу решить эту ошибку?

Edit:

JsonProvider.java 

часть версии CxF-jaxrs 3.1.5

+2

Глядя на [ 'JsonProvider'] (http://docs.oracle.com/javaee/7/api/javax/json/spi/JsonProvider.html), Я не вижу никакого метода readFrom (...) 'для переопределения. В какой библиотеке вы используете? – AJNeufeld

+0

CXF-JAXRS: пакет org.apache.cxf.jaxrs.provider. Версия 3.1.5 –

+0

Любая причина, по которой вы не сохранили параметр типа generic для класса? Я считаю, что если вам это не понадобится, то первый параметр становится 'Class type' not' Class type', чтобы исправить проблему стирания. Если вам это нужно, то добавление его правильно также устранит проблему и является предпочтительным способом ее исправления. –

ответ

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<>(...); 
Смежные вопросы