这个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 = NodeIntf和NodeIntf = NodeImpl,那我们为什么不能Node = NodeImpl呢?我问,因为显然上面的代码不会编译 - 为什么必须使用'自键型引用'?(见教程)
你颠倒了意思<:.A Node可分配给a NodeIntf,即:
val x: NodeIntf = y: Node
Run Code Online (Sandbox Code Playgroud)
现在,下面将进一步你说Node = NodeIntf和NodeIntf = NodeImpl,这是不正确的.Node是一个任意的子类型NodeIntf,NodeImpl是一个特定的子类型NodeIntf.
在方面是,Node是NodeIntf和NodeImpl是一个NodeIntf,但对它们之间的关系没有任何意义-你可能也已经表示,无论是Node和NodeImpl是两种亚型Any.
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |