inheritance - 实现不安全的 Java 接口(interface)

标签 inheritance scala language-interoperability

我最近在使用 Spring Security 进行开发时遇到了一个问题。它有一个接口(interface)GrantedAuthority带有以下签名:

public interface GrantedAuthority extends Serializable, Comparable

而对于 Java 1.5 及更高版本,接口(interface) Comparable接受类型参数 T ,在 Spring Security 库中省略(显然是为了 JVM 1.4 兼容性)。

所以我正在尝试实现 GrantedAuthority在斯卡拉。
class Role extends GrantedAuthority {
  . . .
  def compareTo(obj: Any): Int = obj match {
    case (r: Role) => r.toString.compareTo(this.toString)
    case _ => -1
  }
}

它不编译:
error: class Role needs to be abstract, since method compareTo in trait Comparable of type (T)Int is not defined

如何在 Scala 中实现这样的接口(interface)?

最佳答案

Java 泛型的互操作问题(至少)有两种形式:

  • 如您的示例中那样,省略类型参数的 Java 代码会导致“原始类型”。 Comparable被视为存在类型 Comparable[_] .有时你可以摆脱这个问题。但是,我看不到实现 def compareTo(other: _) = ... 的方法在这种情况下。
  • Java 泛型没有声明站点差异的概念。延长Comparable[T]具有逆变 scala 特征 Ordering[-T]除非您使用 @uncheckedVariance 否则会发生错误注解。 ( Discussion on the mailing list )

  • 我建议您尝试升级到针对 Java 1.5 编译的 Spring 3.x。如果这不可能,写一个基类BaseGrantedAuthority在 Java 中实现 compareTo并委托(delegate)给可以在 Scala 中实现的模板方法。

    关于inheritance - 实现不安全的 Java 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2258718/

    相关文章:

    c++ - 需要帮助理解输出

    java - 子类无法被保护

    java - 我可以在不扩展的情况下访问 Sphere 类的几何形状吗?

    python - spark中哪个函数用于通过key组合两个RDD

    scala - 从 Play Framework 异步调用 Solr

    C-Fortran 字符串互操作性

    ruby - 在 Ruby 中继承类级实例变量?

    struct - 如何在 scala native 中按名称访问结构成员?

    c - Fortran `double precision` 与 C `double` 不同的任何平台?

    scala - Scala 中不可变的类图结构