2015-08-13 1 views
2

Тип уточнения в коде ниже, кажется, говорит о том, что путь в зависимости от типа 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 } генерирует то же сообщение об ошибке.

ответ

5

Я думаю, проблема в том, что в связанной >: this.type привязка для this путается каким-то образом компилятором. Если бы я сделать следующие изменения (& удалить override из asConstrainedValue), компиляция завершается успешно для меня:

trait Value { self => 
    type ValueTypeT <: ValueType { type ValueT >: self.type } 
    … 
+0

Спасибо! Оно работает! Считаете ли вы, что может быть причина, по которой здесь нужно «self =>»? –

+0

Я действительно не знаю, извините. – Hugh

+0

А, я думаю, что я только что понял: 'this' внутри уточнения типа относится к объекту ValueTypeT, а не к объекту' Value'. –

Смежные вопросы