1

我正在尝试在 scala 中实现一个通用的 java 接口。我看过: 如何在 Scala 中扩展包含泛型方法的 Java 接口?Scala:覆盖通用 Java 方法 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
}
4

2 回答 2

8

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

class MyImpl[T] extends JavaInterface[T] {

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

}    

如果我们将您的名称重命名TU,您所做的事情就会变得更清楚:

class MyImpl[T] extends JavaInterface[T] {

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

}    

你也可以试着用 REM 的Losing My Religion的曲调唱“U is not T”来强调这一点。

于 2012-03-25T19:14:57.930 回答
0

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

于 2012-03-25T18:20:23.143 回答