Scala 抽象类型和多态性

标签 scala

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 = NodeIntfNodeIntf = NodeImpl,那为什么我们不能做 Node = NodeImpl?我问是因为显然上面的代码无法编译——为什么必须使用“自键入引用”? ( see tutorial )

最佳答案

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

val x: NodeIntf = y: Node

现在,再往下说 Node = NodeIntfNodeIntf = NodeImpl ,这是不正确的。 NodeNodeIntf任意子类型, 和 NodeImplNodeIntf 的特定子类型.

是一个NodeNodeIntf , 和 NodeImplNodeIntf ,但这对它们之间的关系没有任何意义——你还不如说这两个 NodeNodeImpl都是 Any 的子类型.

关于Scala 抽象类型和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14894790/

相关文章:

scala - Scala 3 宏中的显式类型转换

scala - Scala 是否支持类型构造函数的部分应用?

scala - Akka 和 Vert.x 消息传递模型的区别

scala - 构建一个 ZIO 和 http4s 应用程序,与 sbt 一起工作,失败,Bazel : missing an implicit

javascript - 从 Angular js表单发布数据时出错

Scala:使用 Array[Double] 中的初始值是否安全?

scala - 如何打印在环境变量中使用的依赖 jar ?

scala - 如何从Scala中的内部类引用外部对象

scala - 如何一起使用 Circe Optics 和 Decode

scala - 模式匹配 Nil 和 alternative