Реализация небезопасных интерфейсов Java - PullRequest
6 голосов
/ 13 февраля 2010

Недавно я столкнулся с проблемой при разработке с Spring Security. Имеет интерфейс 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?

1 Ответ

4 голосов
/ 14 февраля 2010

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

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

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

...