我最近在使用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中实现此类接口?
答案 0 :(得分:4)
Java Generics的Interop问题(至少)有两种形式:
Comparable
被视为存在类型Comparable[_]
。有时您可以摆脱这个问题。但是,在这种情况下,我没有看到实现def compareTo(other: _) = ...
的方法。Comparable[T]
扩展Ordering[-T]
,除非使用@uncheckedVariance
注释,否则会发生错误。 (Discussion on the mailing list)我建议您尝试升级到针对Java 1.5编译的Spring 3.x.如果无法做到这一点,请在Java中编写一个实现BaseGrantedAuthority
的基类compareTo
,并委托给可以在Scala中实现的模板方法。