Scala抽象类型和多态性

Law*_*eld 2 scala

这个Scala教程让我很困惑; 在Node抽象类型似乎并不以下多态性的传统规则...

type Node <: NodeIntf                // NodeIntf is assignable to Node.
abstract class NodeIntf {
  def connectWith(node: Node): Edge
}
class NodeImpl extends NodeIntf {
  def connectWith(node: Node): Edge = {
    val edge = newEdge(this, node)   // NodeImpl (this) is assignable to NodeIntf.
    edges = edge :: edges
    edge
  }
}
protected def newEdge(from: Node, to: Node): Edge
Run Code Online (Sandbox Code Playgroud)

如果Node = NodeIntfNodeIntf = NodeImpl,那我们为什么不能Node = NodeImpl呢?我问,因为显然上面的代码不会编译 - 为什么必须使用'自键型引用'?(见教程)

Dan*_*ral 7

你颠倒了意思<:.A Node可分配给a NodeIntf,即:

val x: NodeIntf = y: Node
Run Code Online (Sandbox Code Playgroud)

现在,下面将进一步你说Node = NodeIntfNodeIntf = NodeImpl,这是不正确的.Node是一个任意的子类型NodeIntf,NodeImpl是一个特定的子类型NodeIntf.

在方面,NodeNodeIntfNodeImpl是一个NodeIntf,但对它们之间的关系没有任何意义-你可能也已经表示,无论是NodeNodeImpl是两种亚型Any.