Scala: переопределение методов из интерфейса Java - PullRequest
1 голос
/ 25 марта 2012

Я пытаюсь реализовать общий интерфейс Java в Scala. Я посмотрел на: Как расширить интерфейс Java, содержащий универсальные методы в Scala? И Scala: переопределение общих методов Java II

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

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

Я попробовал следующее в scala:

 @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
}

Ответы [ 2 ]

8 голосов
/ 25 марта 2012

Я думаю, что проблема, вероятно, заключается в том, что вы добавили параметр типа в метод 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 - это не T" под мелодию REM's Losing My Religion , чтобы забить точку домой.

0 голосов
/ 25 марта 2012

В Java у вас есть параметризованный интерфейс, но в Scala вы пытаетесь параметризировать метод.

...