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ć wszystkieMyTypes 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.

Dlaczego nie mogę tego zrobić? Czy istnieje sposób, jak osiągnąć mój cel?

questionAnswers(3)

yourAnswerToTheQuestion