2012-03-25 3 views
1

Я пытаюсь реализовать общий интерфейс Java в scala. Я посмотрел на: How do I extend Java interface containing generic methods in Scala? И Scala: Overriding Generic Java Methods IIScala: переопределение методов из интерфейса Java

Но все-таки я не мог найти ответ. Вот метод подписи от Spring Web:

T read(Class<? extends T> clazz, HttpInputMessage inputMessage) 
      throws IOException, HttpMessageNotReadableException; 

Я попытался следующие в Скале:

@throws(classOf[IOException]) 
    @throws(classOf[HttpMessageNotReadableException]) 
    override def read[T](clazz : Class[_ <: T], inputMessage : HttpInputMessage) : T ={ 
    } 

Но я получаю ошибку о том, что этот метод не отменяет ничего. Если я удалю этот тип, выполните следующие действия:

override def read(clazz : Class[_], inputMessage : HttpInputMessage) : AnyRef ={ 

Он помечает метод как перезаписываемый. Мой вопрос: как я могу сохранить безопасность типов здесь и заставить его переопределить метод интерфейса?

С уважением

EDIT

Пружинный интерфейс:

public interface HttpMessageConverter<T> { 

T read(Class<? extends T> clazz, 
     HttpInputMessage inputMessage) 
     throws IOException, 
       HttpMessageNotReadableException 
} 
+1

Не могли бы вы предоставить ссылку на исходный код Spring Web, где используется метод, который вы пытаетесь переопределить/реализовать? – pedrofurla

ответ

8

Я думаю, что проблема, скорее всего, что вы добавили параметр типа методы read, а не с помощью параметра типа из вашего объявления класса:

class MyImpl[T] extends JavaInterface[T] { 

    override def read(clazz: Class[_ <: T], ...) 

}  

Если переименовать T в U его становится ясным, что вы сделали:

class MyImpl[T] extends JavaInterface[T] { 

    /** U is not T */ 
    override def read[U](clazz: Class[_ <: U], ...) 

}  

вы также можете попробовать и петь «U не Т» на мотив Рэма Лози ng Моя религия, чтобы забить точку дома.

0

В Java вы parameterilized интерфейс, но в Скале вы пытаетесь параметризировать метод.