【问题标题】:Implementing unsafe Java interfaces实现不安全的 Java 接口
【发布时间】:2010-02-13 19:23:08
【问题描述】:

我最近在使用 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 中实现这样的接口?

【问题讨论】:

标签: inheritance scala language-interoperability


【解决方案1】:

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

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

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

【讨论】:

  • 我对这个互操作问题感兴趣,而不是解决我的特殊情况——你完美地向我展示了这一点。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
相关资源
最近更新 更多