Почему переопределение уже реализованного абстрактного типа невозможно? - PullRequest
8 голосов
/ 07 января 2012

С учетом следующего кода:

class A {

  class B

  type C <: B

  trait D

}

class E extends A {

  type C = B

}

class F extends E {

  override type C = B with D

}

Почему компилятор презентаций Scala IDE в Eclipse Indigo IDE жалуется на сообщение об ошибке переопределении типа C в классе E, что равно F.this.B;тип C имеет несовместимый тип ?

В конце концов, класс "B" только "исправлен" с чертой "D", и, следовательно, два определения типа имеют один и тот же базовый тип, который является "B".Следовательно, совместимы определения типов.

Код ниже работает .Я считаю, что правила присвоения типов похожи на присвоение переменных, например:

class Foo

trait Bar

val a: Foo =  new Foo

val fooWithBar: Foo = new Foo with Bar

Неужели мое понимание неверно?

1 Ответ

13 голосов
/ 07 января 2012

Они несовместимы, тип C может использоваться в контравариантной позиции

class E extends A {
  type C = B
  def f(c: C)
}


class F extends E {
  override type C = B with D 
  def f(c: ???)
}

Дополнение дано e: E, вам разрешено звонить e.f(new B).Что если e было val e = new F?

...