2010-02-13 31 views
6

Spring Security ile geliştirirken son zamanlarda bir sorunla karşılaştım. Güvenli olmayan Java arabirimlerinin uygulanması

public interface GrantedAuthority extends Serializable, Comparable 

ve Java 1.5 ve daha geç

, arayüz Comparable (JVM 1.4 uyumluluğu için, tabii ki) Spring Güvenlik kütüphanelerinde atlanmış bir tür parametresi T alır: Aşağıdaki imza ile bir ara GrantedAuthority sahiptir.

Scala'da GrantedAuthority uygulamasını deniyorum.

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

O derleme değil:

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

nasıl Scala böyle arabirimini uygulayabilir? Java Generics ile

+1

Bunun gibi ham türlerle ilgili sesler: https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

Teşekkürler, retronym. Yani son cevap, aslında, "wontfix" dir? – incarnate

cevap

4

Interop'un problemleri (en az) iki formları gelip: En örnekte olduğu gibi argümanlar yazın atlar

  1. Java kodu, 'ham tipler' yol açar. Comparable, varlık türü Comparable[_] olarak kabul edilir. Bazen bu sorundan çıkış yolunu açabilirsin. Ancak, bu durumda def compareTo(other: _) = ... uygulamak için bir yol göremiyorum.
  2. Java jeneriklerinin bildirim alanı varyansı yok. ek açıklamasını kullanmıyorsanız, bir kontravariant scala özelliği Ordering[-T] ile uzatmak için bir hata oluştu. (Discussion on the mailing list)

Java 1.5'e karşı derlenmiş olan Spring 3.x sürümüne yükseltmeyi denemenizi öneririm. Bu mümkün değilse, compareTo uygular ve Scala'da uygulanabilecek bir şablon yöntemine temsilciler için Java'da BaseGrantedAuthority temel sınıf yazın.

+0

Bu interop problemiyle ilgilenmekteydim, özel durumumu çözmek yerine, bana mükemmel bir şekilde gösterdin. Teşekkürler! – incarnate

İlgili konular