Тип уточнения в коде ниже, кажется, говорит о том, что путь в зависимости от типа vt.ValueT
включает this.type
:Компилятор кажется игнорировать тип, связанный с типом уточнения
trait ValueType {
type ValueT <: Value
type ConstrainedT <: ConstrainedValue
def makeConstrainedValue(v: ValueT): ConstrainedT = ???
}
trait Value {
type ValueTypeT <: ValueType { type ValueT >: this.type } // <--- HEY, COMPILER, READ THIS
val vt: ValueTypeT
def asConstrainedValue = vt.makeConstrainedValue(this) // <--- Compiler complains here
}
trait ConstrainedValue { /* details omitted */ }
но компилятор Scala (версия 2.11.2) говорит :
error: type mismatch;
found : Value.this.type (with underlying type Test.Value)
required: Value.this.vt.ValueT
override def asConstrainedValue = vt.makeConstrainedValue(this)
^
есть ли какая-то причина выводя, что this.type <: vt.ValueT
нелегитимна здесь? Есть ли другой способ рассказать компилятору, что ему нужно знать?
Я пробовал нанести уточнение типа на объявление vt
. Компилятор указывает, что результирующий тип равен volatile. Возможно, это ключ к проблеме.
Уточнение { type ValueT = this.type }
генерирует то же сообщение об ошибке.
Спасибо! Оно работает! Считаете ли вы, что может быть причина, по которой здесь нужно «self =>»? –
Я действительно не знаю, извините. – Hugh
А, я думаю, что я только что понял: 'this' внутри уточнения типа относится к объекту ValueTypeT, а не к объекту' Value'. –