实现不安全的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中实现这样的接口?
答
与Java泛型互操作问题进来(至少)两种形式:
并且省略类型参数,因为在你的例子- Java代码,导致“原始类型”。
Comparable
被视为存在类型Comparable[_]
。有时你可以摆脱这个问题。但是,在这种情况下,我看不到实施def compareTo(other: _) = ...
的方法。 - Java泛型没有声明站点方差的概念。要扩展
Comparable[T]
与逆变斯卡拉traitOrdering[-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
与原始类型相关的声音如下所示:https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym 2010-02-13 19:56:40
谢谢,反义词。所以最终的答案实际上是“wontfix”? – incarnate 2010-02-13 20:15:41