专栏原创出处:github-源笔记文件 (opens new window) ,github-源码 (opens new window),欢迎 Star,转载请附上原文出处链接和本声明。
Scala 编程语言专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Scala 编程语言 (opens new window)
一个类被定义到另一个类的内部,作为另一个类的成员而存在,这个类就是一个内部类。
在 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
}
}
}