2010-02-13 52 views
6

我在用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

回答

4

與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