2010-02-13 4 views
6

Spring Security로 개발하는 동안 최근에 문제가 발생했습니다. 안전하지 않은 Java 인터페이스 구현

public interface GrantedAuthority extends Serializable, Comparable 

그리고 자바 1.5 이후로

는, 인터페이스 Comparable이 (JVM 1.4의 호환성을 위해, 명백하게) 봄 보안 라이브러리에서 생략 된 형식 매개 변수 T을한다 : 그것은 다음과 같은 서명이 인터페이스 GrantedAuthority 있습니다.

그래서 스칼라에서 GrantedAuthority을 구현하려고합니다.

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 

어떻게 스칼라 이러한 인터페이스를 구현 할 수 있습니까? 자바 제네릭과

+1

원시 형식과 관련된 소리는 다음과 같습니다. https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

고마워요, retronym. 그래서 최종 답은 사실 "wontfix"입니까? – incarnate

답변

4

상호 운용성 문제가 (적어도) 두 가지 형태로 제공 : 당신의 예에서와 같이 인수를 입력 생략

  1. 자바 코드를, '원시 유형'으로 이어집니다. Comparable은 실재 유형 Comparable[_]으로 처리됩니다. 때로는이 문제를 해결할 수 있습니다. 그러나이 경우에는 def compareTo(other: _) = ...을 구현하는 방법이 없습니다.
  2. Java 제네릭에는 선언 사이트 차이 개념이 없습니다. contravariant scala trait Ordering[-T]으로 Comparable[T]을 확장하려면 @uncheckedVariance 주석을 사용하지 않으면 오류가 발생합니다. (Discussion on the mailing list)

Java 1.5 용으로 컴파일 된 Spring 3.x로 업그레이드하는 것이 좋습니다. 이것이 가능하지 않다면, compareTo을 구현하고 스칼라에서 구현할 수있는 템플릿 메소드에 위임하는 기본 클래스 BaseGrantedAuthority을 Java로 작성하십시오.

+0

필자는이 특별한 문제를 해결하기보다는이 interop 문제에 관심을 쏟았습니다. 감사! – incarnate