2010-02-13 12 views
6

W ostatnim czasie napotkałem problem podczas rozwijania aplikacji Spring Security. Posiada interfejs GrantedAuthority z następującym podpisem:Implementowanie niebezpiecznych interfejsów Java

public interface GrantedAuthority extends Serializable, Comparable 

A co do Java 1.5 i później, interfejs Comparable przyjmuje parametr typu T, która została pominięta w bibliotekach Wiosna nad Bezpieczeństwem (oczywiście dla JVM 1.4 kompatybilności).

Tak więc próbuję wprowadzić GrantedAuthority w Scala.

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

To nie kompiluje:

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

Jak mogę wdrożyć taki interfejs w Scala?

+1

Brzmi nieodłącznie od surowych typów: https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

Dzięki, retronym. Tak więc ostateczna odpowiedź brzmi: "wontfix"? – incarnate

Odpowiedz

4

problemy Interop z Java rodzajowych przyjść w (co najmniej) dwie formy:

  1. kodu Java, które są pomijane typu argumenty, jak w przykładzie, prowadzi do „surowych typów”. Comparable jest traktowany jako typ egzystencjalny Comparable[_]. Czasami możesz wyjść z tego problemu. Jednak nie widzę sposobu na wdrożenie w tym przypadku def compareTo(other: _) = ....
  2. Generics Java nie ma pojęcia wariancji witryny deklaracji. W celu przedłużenia Comparable[T] z przeciwstawną cechą scala Ordering[-T] wystąpił błąd, chyba że użyjesz adnotacji @uncheckedVariance. (Discussion on the mailing list)

Sugeruję, abyś spróbował dokonać aktualizacji do wersji Spring 3.x, która jest kompilowana na Java 1.5. Jeśli nie jest to możliwe, napisz w języku Java klasę podstawową BaseGrantedAuthority, która implementuje compareTo i deleguje do metody szablonu, która może zostać zaimplementowana w Scali.

+0

Byłem zainteresowany tym problemem, a nie rozwiązywaniem konkretnego przypadku - doskonale pokazałeś mi punkt. Dzięki! – incarnate