实现不安全的Java接口

问题描述:

我在用Spring Security进行开发时最近遇到了一个问题。它具有以下签名的接口GrantedAuthority实现不安全的Java接口

public interface GrantedAuthority extends Serializable, Comparable 

而作为对Java 1.5及更高版本,界面Comparable需要一个类型参数T,这是在春季安全库省略(显然,对于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中实现这样的接口?

+1

与原始类型相关的声音如下所示:https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym 2010-02-13 19:56:40

+0

谢谢,反义词。所以最终的答案实际上是“wontfix”? – incarnate 2010-02-13 20:15:41

与Java泛型互操作问题进来(至少)两种形式:

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

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

+0

我对这个互操作问题感兴趣,而不是解决我的具体案例 - 你完美地向我展示了这一点。谢谢! – incarnate 2010-02-13 23:13:33