2010-02-13 44 views
6

Gần đây tôi đã gặp sự cố khi phát triển với Spring Security. Nó có một giao diện GrantedAuthority với chữ ký sau đây:Triển khai các giao diện Java không an toàn

public interface GrantedAuthority extends Serializable, Comparable 

Và như cho Java 1.5 và sau đó, giao diện Comparable mất một tham số kiểu T, được bỏ qua trong các thư viện Xuân An (rõ ràng, cho JVM 1,4 tương thích).

Vì vậy, tôi đang cố triển khai GrantedAuthority trong Scala.

class Role extends GrantedAuthority { 
    . . . 
    def compareTo(obj: Any): Int = obj match { 
    case (r: Role) => r.toString.compareTo(this.toString) 
    case _ => -1 
    } 
} 

Nó không biên dịch:

error: class Role needs to be abstract, since method compareTo in trait Comparable of type (T)Int is not defined 

Làm thế nào tôi có thể thực hiện giao diện như vậy trong Scala?

+1

Âm thanh liên quan đến các loại thô như sau: https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

Cảm ơn, từ viết tắt. Vì vậy, câu trả lời cuối cùng là, "thực sự," wontfix "? – incarnate

Trả lời

4

vấn đề Interop với Java Generics đến trong (ít nhất) hai hình thức:

  1. mã Java mà bỏ qua gõ đối số, như trong ví dụ của bạn, dẫn đến 'loại thô'. Comparable được coi là loại hiện có Comparable[_]. Đôi khi bạn có thể bỏ qua vấn đề này. Tuy nhiên, tôi không thấy cách triển khai def compareTo(other: _) = ... trong trường hợp này.
  2. Generics Java không có khái niệm phương sai khai báo trang web. Để mở rộng Comparable[T] với một đặc điểm scala contravariant Ordering[-T] một lỗi sẽ xảy ra trừ khi bạn sử dụng chú thích @uncheckedVariance. (Discussion on the mailing list)

Tôi đề nghị bạn nên nâng cấp lên Spring 3.x được biên dịch dựa trên Java 1.5. Nếu điều này là không thể, hãy viết một lớp cơ sở BaseGrantedAuthority trong Java thực hiện compareTo và ủy quyền cho một phương thức mẫu có thể được triển khai trong Scala.

+0

Tôi đã quan tâm đến vấn đề này interop, thay vì giải quyết trường hợp cụ thể của tôi - bạn đã cho tôi thấy điểm hoàn hảo. Cảm ơn! – incarnate

Các vấn đề liên quan