Scala'da f-sınırlı polimorfizm elde etmek için soyut tiplerin kullanılması gerektiğini ifade eden birkaç makale okudum. Bu, öncelikle tür çıkarım sorunlarını hafifletmek, ancak aynı zamanda, özyinelemeli türleri tanımlarken tür parametrelerinin ortaya çıkardığı karesel büyümeyi de ortadan kaldırmaktır. Scala'da soyut tipli F-sınırlı polimorfizm
Bu
çok şekilde tanımlanmıştır:1), bir kullanıcı, bu tür bir nesne referans istediği her zaman, aynı zamanda eder:
trait EventSourced[E] {
self =>
type FBound <: EventSourced[E] { type FBound <: self.FBound }
def apply(event: E): FBound
}
Bununla birlikte, bu iki konu tanıtmak görünür FBound
tip parametresi.
def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...
2) derleyici iletisiyle başarısız, yukarıdaki gibi yöntemler için tip parametrelerini anlaması için artık edemiyor:
Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound
orada herkes bir kullanan var mı bu bir kod koku gibi hissediyor F-sınırlı polimorfizmin çözümlerinde başarılı bir şekilde uygulanması, derleyicinin hala türlerini çıkarabilmesi mümkün müdür?
Scala koleksiyonları kütüphane https://github.com/ljwagerfield/scala-type-inference/blob/master/README.md#avoiding-f-bounded-polymorphism sorunsuz başarıyla polimorfizm F-sınırlanmış kullanır. Tip üyeleri yerine tip parametrelerini kullanır, buna dayalı bir çözüm denemek isteyebilirsiniz. – wingedsubmariner
Lütfen bana bakmak için bir örnek verebilir misiniz, yani kütüphanenin hangi bölümleri bunu yapıyor? –
Standart kitaplıktaki [Liste] 'ye (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List) bakın. GenericTraversableTemplate ve LinearSeqOptimized öğelerinin kalıtımında kullanılan F sınırlı polimorfizme dikkat edin. – wingedsubmariner