【问题标题】:Scala: Overriding methods from java interfaceScala:从java接口重写方法
【发布时间】:2012-04-09 09:24:09
【问题描述】:

我正在尝试在 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
}

【问题讨论】:

  • 您能否提供您尝试覆盖/实现的方法所在的 Spring Web 源代码的链接?

标签: scala overriding scala-java-interop


【解决方案1】:

我认为问题很可能是您在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], ... )

}    

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多