2010-02-13 11 views
6

Recentemente ho avuto un problema durante lo sviluppo con Spring Security. È dotato di un'interfaccia GrantedAuthority con seguente firma:Implementazione di interfacce Java non sicure

public interface GrantedAuthority extends Serializable, Comparable 

E per quanto riguarda Java 1.5 e versioni successive, l'interfaccia Comparable prende un parametro di tipo T, che viene omesso nelle biblioteche Primavera di sicurezza (ovviamente, per la JVM 1.4 compatibilità).

Quindi sto cercando di implementare GrantedAuthority in Scala.

class Role extends GrantedAuthority { 
    . . . 
    def compareTo(obj: Any): Int = obj match { 
    case (r: Role) => r.toString.compareTo(this.toString) 
    case _ => -1 
    } 
} 

Esso non può essere compilato:

error: class Role needs to be abstract, since method compareTo in trait Comparable of type (T)Int is not defined 

Come posso implementare tale interfaccia a Scala?

+1

Suoni relativi a tipi non elaborati come questo: https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

Grazie, retronym. Quindi la risposta finale è, in realtà, "wontfix"? – incarnate

risposta

4

problemi di interoperabilità con Java Generics sono disponibili in (almeno) due forme:

  1. codice Java che omette tipo argomenti, come nel tuo esempio, porta a 'tipi prime. Comparable viene considerato come tipo esistenziale Comparable[_]. A volte puoi uscire da questo problema. Tuttavia, in questo caso non vedo un modo per implementare def compareTo(other: _) = ....
  2. I generici Java non hanno una nozione di variazione del sito di dichiarazione. Per estendere Comparable[T] con una scala contravariant Ordering[-T] si verificherebbe un errore a meno che non si utilizzi l'annotazione @uncheckedVariance. (Discussion on the mailing list)

Suggerisco di provare ad aggiornare a Spring 3.x che è compilato su Java 1.5. Se ciò non è possibile, scrivere una classe base BaseGrantedAuthority in Java che implementa compareTo e delegati a un metodo di modello che può essere implementato in Scala.

+0

Ero interessato a questo problema di interoperabilità, piuttosto che risolvere il mio caso particolare: mi hai mostrato perfettamente il punto. Grazie! – incarnate