Я имею, недавно столкнулся с проблемой при разработке с безопасностью Spring. Это имеет интерфейс GrantedAuthority
со следующей подписью:
public interface GrantedAuthority extends Serializable, Comparable
И что касается Java 1.5 и позже, интерфейс Comparable
берет параметр типа T
, который опущен в библиотеках Spring Security (очевидно, для совместимости JVM 1.4).
Таким образом, я пытаюсь реализовать GrantedAuthority
в Scala.
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?
Проблемы взаимодействия с Java Generics бывают (по крайней мере) двух форм:
Сопоставимое
рассматривается как экзистенциальный тип Сопоставимое [_]
. Иногда вы можете найти выход из этой проблемы. Однако я не вижу способа реализовать def compareTo (other: _) = ...
в этом случае. Comparable [T]
с помощью контравариантного признака scala Ordering [-T]
, возникнет ошибка, если вы не используете аннотацию @uncheckedVariance
. ( Обсуждение в списке рассылки ) Я предлагаю вам попробовать перейти на Spring 3.x, который скомпилирован против Java 1.5. Если это невозможно, напишите базовый класс BaseGrantedAuthority
в Java, который реализует compareTo
и делегирует шаблонный метод, который можно реализовать в Scala.