专栏原创出处:github-源笔记文件 github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。

Scala 编程语言专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Scala 编程语言

一个类被定义到另一个类的内部,作为另一个类的成员而存在,这个类就是一个内部类。
在 Java 中,内部类是绑定到外部类上的,而在 Scala 中,内部类是绑定到外部类实例化的对象上的。

  class Graph {
    // 类 Node 是一个路径依赖类型,因为它嵌套在类 Graph 中。 
    class Node {
      // connectedNodes 中存储的所有节点必须使用同一个 Graph 的实例对象的 newNode 方法来创建。
      var connectedNodes: List[Node] = Nil
      
      def connectTo(node: Node) {
        if (!connectedNodes.exists(node.equals)) {
          connectedNodes = node :: connectedNodes
        }
      }
    }
    var nodes: List[Node] = Nil
    def newNode: Node = {
      val res = new Node
      nodes = res :: nodes
      res
    }
  }
  // node1、node2、node3 都是由 graph1 创建,因此彼此之间可以互相传入 connectTo 方法
  val graph1: Graph = new Graph
  val node1: graph1.Node = graph1.newNode
  val node2: graph1.Node = graph1.newNode
  val node3: graph1.Node = graph1.newNode
  node1.connectTo(node2)
  node3.connectTo(node1)

  // 编译报错,因为 node4 是由 graph2 创建,而 node1.connectTo 方法只能接收 graph1.Node 类型的参数
  val graph2: Graph = new Graph
  val node4: graph2.Node = graph2.newNode
  node1.connectTo(node4)      // illegal!,但是在 java 中这样调用是可以的
  
  // 如果想要 node1 连接 node4 的话,应该这样定义 Node 中的类型[Graph#Node]
  class Node {
      var connectedNodes: List[Graph#Node] = Nil
      def connectTo(node: Graph#Node) {
        if (!connectedNodes.exists(node.equals)) {
          connectedNodes = node :: connectedNodes
        }
      }
  }
最后修改时间: 1/7/2020, 4:30:22 PM