内部类就是class里面的class,在java里面,内部类被看成是外部类的成员。
    但是在scala中内部类是和外部类的对象进行绑定的。这意味着即使是同一个外部类的不同对象,其包含的内部类是不同类型的。 我们举个例子

    1. class Graph {
    2. class Node {
    3. var connectedNodes: List[Node] = Nil
    4. def connectTo(node: Node) {
    5. if (!connectedNodes.exists(node.equals)) {
    6. connectedNodes = node :: connectedNodes
    7. }
    8. }
    9. }
    10. var nodes: List[Node] = Nil
    11. def newNode: Node = {
    12. val res = new Node
    13. nodes = res :: nodes
    14. res
    15. }
    16. }

    这里connectedNodes 中存储的所有节点必须使用同一个 Graph 的实例对象的 newNode 方法来创建。

    1. val graph1: Graph = new Graph
    2. val node1: graph1.Node = graph1.newNode
    3. val node2: graph1.Node = graph1.newNode
    4. val node3: graph1.Node = graph1.newNode
    5. node1.connectTo(node2)
    6. node3.connectTo(node1)

    这里三个node都是graph1.Node类型。如果是非graph1.Node类型则无法编译成功。

    1. val graph1: Graph = new Graph
    2. val node1: graph1.Node = graph1.newNode
    3. val node2: graph1.Node = graph1.newNode
    4. node1.connectTo(node2) // legal
    5. val graph2: Graph = new Graph
    6. val node3: graph2.Node = graph2.newNode
    7. node1.connectTo(node3) // illegal!

    那如果想达到和java中内部内中一样的效果,不区分路径该怎么办呢?使用Graph#Node即可。

    1. class Graph {
    2. class Node {
    3. var connectedNodes: List[Graph#Node] = Nil
    4. def connectTo(node: Graph#Node) {
    5. if (!connectedNodes.exists(node.equals)) {
    6. connectedNodes = node :: connectedNodes
    7. }
    8. }
    9. }
    10. var nodes: List[Node] = Nil
    11. def newNode: Node = {
    12. val res = new Node
    13. nodes = res :: nodes
    14. res
    15. }
    16. }

    这里connectedNodes 中存储的所有节点必须使用同一个 Graph 的实例对象的 newNode 方法来创建。

    1. val graph1: Graph = new Graph
    2. val node1: graph1.Node = graph1.newNode
    3. val node2: graph1.Node = graph1.newNode
    4. val node3: graph1.Node = graph1.newNode
    5. node1.connectTo(node2)
    6. node3.connectTo(node1)

    这里三个node都是graph1.Node类型。如果是非graph1.Node类型则无法编译成功。

    1. val graph1: Graph = new Graph
    2. val node1: graph1.Node = graph1.newNode
    3. val node2: graph1.Node = graph1.newNode
    4. node1.connectTo(node2) // legal
    5. val graph2: Graph = new Graph
    6. val node3: graph2.Node = graph2.newNode
    7. node1.connectTo(node3) // illegal!

    那如果想达到和java中内部内中一样的效果,不区分路径该怎么办呢?使用Graph#Node即可。

    1. class Graph {
    2. class Node {
    3. var connectedNodes: List[Graph#Node] = Nil
    4. def connectTo(node: Graph#Node) {
    5. if (!connectedNodes.exists(node.equals)) {
    6. connectedNodes = node :: connectedNodes
    7. }
    8. }
    9. }
    10. var nodes: List[Node] = Nil
    11. def newNode: Node = {
    12. val res = new Node
    13. nodes = res :: nodes
    14. res
    15. }
    16. }