Bunlara genelleştirilmiş tip kısıtlamaları denir . Bunlar, tür parametreli bir sınıf veya özellik içinde, tür parametrelerinden birini daha da kısıtlamanıza olanak tanır . İşte bir örnek:
case class Foo[A](a:A) { // 'A' can be substituted with any type
// getStringLength can only be used if this is a Foo[String]
def getStringLength(implicit evidence: A =:= String) = a.length
}
Örtük argüman evidencederleyici tarafından sağlanır, iff Ais String. Bir olarak düşünmek olabilir kanıtıA olan String--Forum argüman kendisi sadece var olduğunu bilerek, önemli değildir. [değiştir: o bir örtük dönüştürme temsil ettiği şey, teknik olarak aslında önemli olan Aiçin Stringaramak mümkün kılan budur, a.lengthve sana derleyici çığlık yok]
Şimdi şöyle kullanabilirsiniz:
scala> Foo("blah").getStringLength
res6: Int = 4
Ama ben Foobaşka bir şey içeren içeren kullanmayı denerseniz String:
scala> Foo(123).getStringLength
<console>:9: error: could not find implicit value for parameter evidence: =:=[Int,String]
Bu hatayı "Int == String" in kanıtı bulamadığı için okuyabilirsiniz ... olması gerektiği gibi! getStringLengthheybetli daha fazla kısıtlama türüne Aolandan Foogenel olarak gerektirir; yani, yalnızca getStringLengthbir Foo[String]. Bu kısıtlama derleme zamanında uygulanır, bu da iyidir!
<:<ve <%<benzer şekilde çalışır, ancak küçük varyasyonlarla:
A =:= B A'nın tam olarak B olması gerektiği anlamına gelir
A <:< B"A" ifadesi, B'nin bir alt türü olmalıdır ( basit tip kısıtlamasına benzer <:)
A <%< B A demek olmalı , muhtemelen örtük dönüşüm yoluyla B görüntülenebilir (basit tür kısıtlamasına benzer <%)
@Retronym tarafından yapılan bu pasaj , bu tür şeylerin nasıl yapıldığı ve genelleştirilmiş tür kısıtlamalarının şimdi nasıl kolaylaştırdığı hakkında iyi bir açıklamadır.
EK
Takip eden sorunuzu cevaplamak için, itiraf ettiğim örnek oldukça sadık ve açıkçası kullanışlı değil. Ancak List.sumInts, bir tamsayı listesi ekleyen bir yöntem gibi bir şey tanımlamak için bunu hayal edin . Bu yöntemin eski bir sistemde çağrılmasına izin vermek istemezsiniz List, sadece a List[Int]. Ancak, Listtür oluşturucu bu kadar kısıtlı olamaz; yine de dize, foos, çubuk ve notların listelerine sahip olmak istersiniz. Bu nedenle, genelleştirilmiş bir tür kısıtlaması yerleştirerek sumInts, yalnızca bu yöntemin yalnızca a üzerinde kullanılabilecek ek bir kısıtlamaya sahip olmasını sağlayabilirsiniz List[Int]. Temelde belirli listeler için özel durum kodu yazıyorsunuz.