Реализация небезопасных интерфейсов Java

Я имею, недавно столкнулся с проблемой при разработке с безопасностью 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?

6
задан incarnate 13 February 2010 в 19:23
поделиться

1 ответ

Проблемы взаимодействия с Java Generics бывают (по крайней мере) двух форм:

  1. Java-код, в котором отсутствуют аргументы типа, как в вашем примере, приводит к «необработанным типам». Сопоставимое рассматривается как экзистенциальный тип Сопоставимое [_] . Иногда вы можете найти выход из этой проблемы. Однако я не вижу способа реализовать def compareTo (other: _) = ... в этом случае.
  2. В дженериках Java нет понятия о вариативности сайта объявления. Чтобы расширить Comparable [T] с помощью контравариантного признака scala Ordering [-T] , возникнет ошибка, если вы не используете аннотацию @uncheckedVariance . ( Обсуждение в списке рассылки )

Я предлагаю вам попробовать перейти на Spring 3.x, который скомпилирован против Java 1.5. Если это невозможно, напишите базовый класс BaseGrantedAuthority в Java, который реализует compareTo и делегирует шаблонный метод, который можно реализовать в Scala.

4
ответ дан 17 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: