6

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

public interface GrantedAuthority extends Serializable, Comparable

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

所以我试图GrantedAuthority在 Scala 中实现。

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 中实现这样的接口?

4

1 回答 1

4

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

  1. 如您的示例中那样,省略类型参数的 Java 代码会导致“原始类型”。Comparable被视为存在类型Comparable[_]。有时你可以摆脱这个问题。但是,我看不到def compareTo(other: _) = ...在这种情况下实施的方法。
  2. Java 泛型没有声明站点差异的概念。Comparable[T]要使用逆变 scala 特征进行扩展,除非您使用注释Ordering[-T],否则会发生错误。@uncheckedVariance关于邮件列表的讨论

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

于 2010-02-13T22:13:07.117 回答