This Scala tutorial让我感到困惑; 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
如果 Node = NodeIntf
和 NodeIntf = NodeImpl
,那为什么我们不能做 Node = NodeImpl
?我问是因为显然上面的代码无法编译——为什么必须使用“自键入引用”? ( see tutorial )
最佳答案
你颠倒了<:
的意思. Node
可分配给 NodeIntf
,即:
val x: NodeIntf = y: Node
现在,再往下说 Node = NodeIntf
和 NodeIntf = NodeImpl
,这是不正确的。 Node
是 NodeIntf
的任意子类型, 和 NodeImpl
是 NodeIntf
的特定子类型.
是一个,Node
是 NodeIntf
, 和 NodeImpl
是 NodeIntf
,但这对它们之间的关系没有任何意义——你还不如说这两个 Node
和 NodeImpl
都是 Any
的子类型.
关于Scala 抽象类型和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894790/