代码之家  ›  专栏  ›  技术社区  ›  BorisOkunskiy

实现不安全的Java接口

  •  6
  • BorisOkunskiy  · 技术社区  · 15 年前

    我最近在开发Spring安全性时遇到了一个问题。它有一个接口 GrantedAuthority 签字如下:

    public interface GrantedAuthority extends Serializable, Comparable
    

    至于Java 1.5和以后的接口 Comparable 接受类型参数 T ,这在Spring安全库中被省略(显然,对于JVM 1.4兼容性)。

    所以我正在努力实现 授权当局 在斯卡拉。

    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 回复  |  直到 15 年前
        1
  •  4
  •   retronym    15 年前

    Java泛型的互操作问题至少有两种形式:

    1. 如实例中省略类型参数的Java代码导致“原始类型”。 Comparable 被视为存在型 Comparable[_] . 有时你可以摆脱这个问题。但是,我看不到实现的方法 def compareTo(other: _) = ... 在这种情况下。
    2. Java泛型没有声明站点差异的概念。延伸 Comparable[T] 具有反变体鳞片特征 Ordering[-T] 如果不使用 @uncheckedVariance 注释。( Discussion on the mailing list )

    我建议您升级到Spring 3 .x,它是针对Java 1.5编译的。如果不可能,则编写一个基类 BaseGrantedAuthority 在Java中实现的 compareTo 并委托给可以在scala中实现的模板方法。