Nie można zastąpić typu z nieulotną górną granicą
Mam błąd kompilatora w scali i nie wiem, do czego się odnosi:
Załóż te deklaracje:
trait Abstract {
type MyType
}
trait AInner
trait A extends Abstract{
type MyType <: AInner
}
trait BInner {
def bMethod : Int
}
trait B extends Abstract with A{
override type MyType <: BInner with A#MyType
}
Co próbuję tutaj osiągnąć (w cechachB
) jest dalsze ograniczenie typuMyType
zadeklarowano wAbstract
, więc każda wartość typuMyType
musi rozszerzyć wszystkieMyType
s w drzewie mixin.Kompilator przekazuje mi tę wiadomość (jak w tytule):typ MyType jest typem lotnym; nie można zastąpić typu z nieulotną górną granicą. Rozumiem, żezmienność typu dzieje się tutaj z powodu połączenia typówwith A#MyType
, część błędu:typ z nieulotną górną granicą prawdopodobnie odnosi się do deklaracji typutype MyType <: AInner
, gdzieAInner
nie jest więc typem abstrakcyjnym nieulotnym.