scala self-type:类型参数错误的成员

dsg*_*dsg 2 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
}
Run Code Online (Sandbox Code Playgroud)

错误是:

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

Dav*_*ith 6

通过改变 - 的定义

def -(v:V):Vec[V]
Run Code Online (Sandbox Code Playgroud)

  • 自我类型声明是单向的.它说Vec [V]是一个符合V型的类型,但不是V是符合Vec [V]的类型(实际的语义更复杂,因为自我类型不是外部可见的,但这就是它相当于这里).你的原始代码有 - 返回V,但调用norm需要一个Vec [V]. (2认同)