Bir veri yapısı uyguluyorum. Scala'nın standart koleksiyon özelliklerinden hiçbirini doğrudan karıştırmasa da, bir üretici fabrikada standart Scala koleksiyonları oluşturabilen to[Col[_]]
yöntemini eklemek istiyorum.Bir eşdeğişim koleksiyonu için [Col [_]] `metodunun eklenmesi
Şimdi GenTraversableOnce
kopyalanan bu, varsayalım:
trait Foo[+A] {
def to[Col[_]](implicit cbf: CanBuildFrom[Nothing, A, Col[A]]): Col[A]
}
Bu error: covariant type A occurs in invariant position
ile başarısız olur.
GenTraversableOnce
bunu nasıl sağlayabilir? Kaynak kodunda, bir annotation.unchecked.uncheckedVariance
...
'u görebiliyorum. Bu, kirli bir numaraya benziyor. Eğer bu seviye normal olarak reddedilirse, bu nasıl güvenli olabilir ve uncheckedVariance
ile nasıl kapatılabilir?
Sen don: varyans kurallarına saygı değişmez yardımcı sınıfına bildirdiğinden özellikten diğerine dönüştürmek için örtük dönüştürme kullanırken biz özelliğin dışında değişmeyen kodu taşımak ve sadece eşdeğişkin bölümünü tutabilir ederken
sorunu çözmek için Gerçekten A 've' A1' ile ilgili. Bu da çalışır: [def [c] Col [_]] (kapalı cbf: CanBuildFrom [Hiçbir şey, A, Col [B]]): Col [B] '. Bu bile gereksiz bir şekilde kısıtlayıcı gözüküyor, sadece “Col [B]” şeklinin sonucuna izin veriyor. Bu daha genel ve basit görünüyor: [R] (kapalı cbf: CanBuildFrom [Hiçbir şey, A, R]): R'. – Rotsor