Scala:从java接口覆盖方法

Vin*_*lho 1 overriding scala scala-java-interop

我正在尝试在scala中实现通用java接口.我看过: 如何在Scala中扩展包含泛型方法的Java接口?Scala:重写通用Java方法II

但我还是找不到答案.这是Spring web的方法签名:

T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException;
Run Code Online (Sandbox Code Playgroud)

我在scala中尝试了以下内容:

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

但我得到一个错误,说这种方法无法覆盖.如果我通过执行以下操作擦除类型:

override def read(clazz : Class[_], inputMessage : HttpInputMessage) : AnyRef ={
Run Code Online (Sandbox Code Playgroud)

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

问候

编辑

弹簧接口:

public interface HttpMessageConverter<T> {

T read(Class<? extends T> clazz,
       HttpInputMessage inputMessage)
       throws IOException,
              HttpMessageNotReadableException
}
Run Code Online (Sandbox Code Playgroud)

oxb*_*kes 8

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

class MyImpl[T] extends JavaInterface[T] {

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

}    
Run Code Online (Sandbox Code Playgroud)

如果我们重命名你T,U那么你做得更清楚了:

class MyImpl[T] extends JavaInterface[T] {

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

}    
Run Code Online (Sandbox Code Playgroud)

你也可以尝试用REM的" 失去我的宗教"来演唱"U is not T",以便将重点放在家中.