2013-11-21 19 views
5

ile sınırlayan, ben bağlam sınırları kullanabilirsiniz:Bağlam Scala iki jenerik parametreleri

def sort[T : Ordered](t: Seq[T]) 

olarak aynı şeyi ifade etmek için:

def sort[T](t: Seq[T])(implicit def Ordered[T]) 

Ya iki genel parametrelerle bir sınıf varsa. Yani Writer[T, String] numaralı telefon hattına sahip olduğumdan emin olmak istiyorum. Bağlam sınırlarını kullanabileceğim bir sözdizimi var mı (T : ...) veya örtülü olarak açık bir şekilde yazmam gerekiyor mu (yazmak çok eğlenceli).

cevap

10

Evet, mümkün! Ama gerçekten çok güzel:

trait Writer[T, O] { 
    def write(t: T): O 
} 

def writeToString[T: ({ type L[x] = Writer[x, String] })#L](t: T) = 
    implicitly[Writer[T, String]].write(t) 

implicit object intToStringWriter extends Writer[Int, String] { 
    def write(t: Int) = t.toString 
} 

Ve sonra:

scala> writeToString(1) 
res0: String = 1 

({ type L[x] = Writer[x, String] })#L şey type lambda denir. Bazen çok uygundurlar (eğer buggy), ama bu kesinlikle o zamanlardan biri değildir. Açık örtülü olmaktan çok daha iyisin.

+1

Açık örtülü olarak kullanacağım! – schmmd

İlgili konular