Scala:从java接口覆盖方法

时间:2012-03-25 17:58:34

标签: scala override scala-java-interop

我正在尝试在scala中实现通用java接口。我看过: How do I extend Java interface containing generic methods in Scala?Scala: Overriding Generic Java Methods II

但我仍然无法找到答案。这是Spring web的方法签名:

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 ={

它将方法标记为被覆盖。我的问题是如何在这里保持类型安全并强制它覆盖接口方法?

此致

修改

弹簧界面:

public interface HttpMessageConverter<T> {

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

2 个答案:

答案 0 :(得分:8)

我认为问题很可能是你已经在read方法中添加了一个类型参数,而不是使用类声明中的type参数:

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], ... )

}    

你也可以尝试用REM的失去我的宗教来调整“U is not T”来点回家。

答案 1 :(得分:0)

在java中你有参数化接口,但在scala中你尝试参数化方法。