Исправление абстрактных типов в типе self - PullRequest
3 голосов
/ 19 декабря 2011

Учтите это:

object TypeProblem {

  trait A {
    type T
    val set = Set[T]()
  }

  trait B {
    def b()
  }

  trait FooBad { this: A =>
    type T <: B
    def x {
      set.foreach(_.b())
    }
  }

  trait FooOk { this: A =>
    type MyT <: B
    type T = MyT

    def x {
      set.foreach(_.b())
    }
  }

}

Компилятор жалуется, что значение b не является членом FooBad.this.T Так почему же FooOk работает, когда я определяю новый тип MyT и назначаю T для MyT?

1 Ответ

4 голосов
/ 19 декабря 2011

Тип собственного FooBad расширен компилятором до FooBad with A (так что вы все равно можете получить доступ к элементам, которые вы определяете сами). Это означает, что T получает определение в A, а не определение в FooBad, как вы ожидаете. Вы можете исправить свой код, изменив определение FooBad, чтобы явно добавить свой собственный тип:

trait FooBad { this: A with FooBad =>
   ..
}

или даже лучше, используя подклассы

trait FooBad extends A {
  ..
}

Я считаю, что в большинстве случаев самотипы должны быть заменены простым подклассом. Это проще для понимания, менее страшно и приводит к лучшей инкапсуляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...