2011-01-23 4 views
2

Это продолжение к this question.scala self-type: член типа ошибка параметра

Почему этот код не компилируется и как его исправить?

trait Vec[V] { self:V => 
    def -(v:V):V 
    def dot(v:V):Double 

    def norm:Double = math.sqrt(this dot this) 
    def dist(v:V):Double = (this - v).norm 
} 

Ошибка:

Vec.scala:6: error: value norm is not a member of type parameter V 
    def dist(v:V):V = (this - v).norm 
          ^

ответ

3

правильного решения является:

trait Vec[V <: Vec[V]] { self:V => 
    def -(v:V):V 
    def dot(v:V):Double 

    def norm:Double = math.sqrt(this dot this) 
    def dist(v:V):Double = (this - v).norm 
} 

Принадлежит к Debilski для ответа до related question.

6

Изменяя определение - к

def -(v:V):Vec[V] 
+0

Спасибо. Что случилось? – dsg

+2

Объявление самонастройки однонаправлено. В нем говорится, что Vec [V] - тип, соответствующий типу V, но не тот, что V является типом, соответствующим Vec [V] (фактическая семантика более активна, так как само-типы внешне не видны, но это то, что оно составляет здесь). У вашего исходного кода был - возврат V, но для вызова нормы требуется Vec [V]. –