2010-02-13 12 views
6

J'ai récemment rencontré un problème lors du développement de Spring Security. Il dispose d'une interface GrantedAuthority avec la signature suivante:Implémentation d'interfaces Java non sécurisées

public interface GrantedAuthority extends Serializable, Comparable 

Et comme pour Java 1.5 et plus tard, l'interface Comparable prend un paramètre de type T, qui est omis dans les bibliothèques de printemps de sécurité (évidemment, pour la compatibilité machine virtuelle Java 1.4). Donc, je suis en train d'implémenter GrantedAuthority dans Scala.

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

Il ne compile pas:

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

Comment puis-je mettre en œuvre cette interface Scala?

+1

Sons liés aux types bruts comme ceci: https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

Merci, retronym. Donc, la réponse finale est, en fait, "wontfix"? – incarnate

Répondre

4

problèmes Interop avec Java Generics viennent dans (au moins) deux formes:

  1. code Java qui omet de type arguments, comme dans votre exemple, conduit à 'types bruts'. est traité comme le type existentiel Comparable[_]. Parfois, vous pouvez vous débarrasser de ce problème. Cependant, je ne vois pas un moyen de mettre en œuvre def compareTo(other: _) = ... dans ce cas.
  2. Les génériques Java n'ont pas de notion de variance de site de déclaration. Pour étendre Comparable[T] avec un trait de scala contravariant Ordering[-T], une erreur se produirait à moins que vous n'utilisiez l'annotation @uncheckedVariance. (Discussion on the mailing list)

Je vous suggère de mettre à niveau vers Spring 3.x qui est compilé avec Java 1.5. Si ce n'est pas possible, écrivez une classe de base BaseGrantedAuthority dans Java qui implémente compareTo et délègue à une méthode de modèle qui peut être implémentée dans Scala.

+0

Je me suis intéressé à ce problème d'interopérabilité, plutôt que de résoudre mon cas particulier - vous m'avez parfaitement montré le point. Merci! – incarnate