Следующий код:Типы, зависящие от пути - что не так в следующем коде?
trait Foo {
type T
val x: T
}
trait Bar {
type F <: Foo { type T <: F }
}
class C[B <: Bar](val f: B#F) {
val x: f.T = f.x
}
отвергается компилятором Scala (2.11.5) со следующим сообщением об ошибке:
error: type mismatch;
found : C.this.f.x.type (with underlying type C.this.f.T)
required: this.T
val x: f.T = f.x
^
Если объявление явного типа опущена, тип правильно Inferred , в соответствии с выходом из TypeR фазы:
private[this] val x: C.this.f.T = C.this.f.x;
<stable> <accessor> def x: C.this.f.T = C.this.x
проблема также исчезает, если F
внутри связаны в Bar
изменяется к типу, который не является членом Bar
, т.е.
type F <: Foo { type T <: Foo }
работает правильно.
Это ошибка? Или какое-то фундаментальное недоразумение с моей стороны? Или какая-то тайная функция?
Спасибо, что вам интересно. Смешно, без этого объявления компилятор _infers_ типа 'x' как' f.T' сам, как упоминалось в вопросе. Кроме того, он позволяет использовать его как таковой в коде с помощью 'Foo' и' C'. Таким образом, единственная проблема заключается в явной декларации - отсюда и мое замешательство. –