6

最近、Spring Security で開発中に問題が発生しました。GrantedAuthority次のシグネチャを持つインターフェイスがあります。

public interface GrantedAuthority extends Serializable, Comparable

また、Java 1.5 以降では、インターフェースComparableは型パラメーターを取りますがT、これは Spring Security ライブラリーでは省略されています (明らかに、JVM 1.4 との互換性のために)。

だから私はGrantedAuthorityScalaで実装しようとしています。

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 でそのようなインターフェースを実装するにはどうすればよいですか?

4

1 に答える 1

4

Java Generics との相互運用の問題には、(少なくとも) 2 つの形式があります。

  1. あなたの例のように、型引数を省略したJavaコードは、「生の型」につながります。Comparableは存在型として扱われComparable[_]ます。場合によっては、この問題から抜け出すことができます。def compareTo(other: _) = ...ただし、この場合に実装する方法がわかりません。
  2. Java ジェネリックには、宣言サイトの差異の概念がありません。Comparable[T]反変の scala trait で拡張するには、アノテーションOrdering[-T]を使用しないとエラーが発生します。@uncheckedVariance(メーリングリストでの議論)

Java 1.5 に対してコンパイルされた Spring 3.x にアップグレードすることをお勧めします。これが不可能な場合は、Scala で実装できるテンプレート メソッドをBaseGrantedAuthority実装してデリゲートする基本クラスを Java で記述します。compareTo

于 2010-02-13T22:13:07.117 に答える