实现不安全的Java接口

时间:2010-02-13 19:23:08

标签: inheritance scala language-interoperability

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

public interface GrantedAuthority extends Serializable, Comparable

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

所以我尝试在Scala中实现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中实现此类接口?

1 个答案:

答案 0 :(得分:4)

Java Generics的Interop问题(至少)有两种形式:

  1. 省略类型参数的Java代码(如示例所示)会导致“原始类型”。 Comparable被视为存在类型Comparable[_]。有时您可以摆脱这个问题。但是,在这种情况下,我没有看到实现def compareTo(other: _) = ...的方法。
  2. Java泛型没有声明站点差异的概念。要使用逆变量scala特征Comparable[T]扩展Ordering[-T],除非使用@uncheckedVariance注释,否则会发生错误。 (Discussion on the mailing list
  3. 我建议您尝试升级到针对Java 1.5编译的Spring 3.x.如果无法做到这一点,请在Java中编写一个实现BaseGrantedAuthority的基类compareTo,并委托给可以在Scala中实现的模板方法。