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 evidence
derleyici tarafından sağlanır, iff A
is 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 A
için String
aramak mümkün kılan budur, a.length
ve sana derleyici çığlık yok]
Şimdi şöyle kullanabilirsiniz:
scala> Foo("blah").getStringLength
res6: Int = 4
Ama ben Foo
baş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! getStringLength
heybetli daha fazla kısıtlama türüne A
olandan Foo
genel olarak gerektirir; yani, yalnızca getStringLength
bir 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, List
tü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.