2010-02-13 15 views
6

He tenido un problema recientemente al desarrollar con Spring Security. Cuenta con una interfaz GrantedAuthority con firma siguiente:Implementación de interfaces Java no seguras

public interface GrantedAuthority extends Serializable, Comparable 

Y como para Java 1.5 y posteriores, la interfaz Comparable toma un parámetro de tipo T, que se omite en las bibliotecas de seguridad de Primavera (obviamente, para JVM 1.4 compatibilidad).

Así que estoy tratando de implementar GrantedAuthority en Scala.

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

No compila:

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

¿Cómo puedo poner en práctica este tipo de interfaz en Scala?

+1

Sonidos relacionados con tipos crudos como este: https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

Gracias, retronym. ¿Entonces la respuesta final es, en realidad, "wontfix"? – incarnate

Respuesta

4

problemas de interoperabilidad con los genéricos de Java vienen en (al menos) dos formas:

  1. código Java que omite escribir argumentos, como en el ejemplo, conduce a "tipos de primas. Comparable se trata como el tipo existencial Comparable[_]. A veces puedes salir de este problema. Sin embargo, no veo una forma de implementar def compareTo(other: _) = ... en este caso.
  2. Los genéricos de Java no tienen una noción de la varianza del sitio de declaración. Para ampliar Comparable[T] con un rasgo de scala contravariante Ordering[-T], se produciría un error a menos que utilice la anotación @uncheckedVariance. (Discussion on the mailing list)

Le sugiero que intente actualizar a Spring 3.x que se compila contra Java 1.5. Si esto no es posible, escriba una clase base BaseGrantedAuthority en Java que implemente compareTo y delegue en un método de plantilla que pueda implementarse en Scala.

+0

Estaba interesado en este problema de interoperabilidad, en lugar de resolver mi caso particular; me mostraste el punto a la perfección. ¡Gracias! – incarnate

Cuestiones relacionadas