内部类就是class里面的class,在java里面,内部类被看成是外部类的成员。
但是在scala中内部类是和外部类的对象进行绑定的。这意味着即使是同一个外部类的不同对象,其包含的内部类是不同类型的。 我们举个例子
class Graph {class Node {var connectedNodes: List[Node] = Nildef connectTo(node: Node) {if (!connectedNodes.exists(node.equals)) {connectedNodes = node :: connectedNodes}}}var nodes: List[Node] = Nildef newNode: Node = {val res = new Nodenodes = res :: nodesres}}
这里connectedNodes 中存储的所有节点必须使用同一个 Graph 的实例对象的 newNode 方法来创建。
val graph1: Graph = new Graphval node1: graph1.Node = graph1.newNodeval node2: graph1.Node = graph1.newNodeval node3: graph1.Node = graph1.newNodenode1.connectTo(node2)node3.connectTo(node1)
这里三个node都是graph1.Node类型。如果是非graph1.Node类型则无法编译成功。
val graph1: Graph = new Graphval node1: graph1.Node = graph1.newNodeval node2: graph1.Node = graph1.newNodenode1.connectTo(node2) // legalval graph2: Graph = new Graphval node3: graph2.Node = graph2.newNodenode1.connectTo(node3) // illegal!
那如果想达到和java中内部内中一样的效果,不区分路径该怎么办呢?使用Graph#Node即可。
class Graph {class Node {var connectedNodes: List[Graph#Node] = Nildef connectTo(node: Graph#Node) {if (!connectedNodes.exists(node.equals)) {connectedNodes = node :: connectedNodes}}}var nodes: List[Node] = Nildef newNode: Node = {val res = new Nodenodes = res :: nodesres}}
这里connectedNodes 中存储的所有节点必须使用同一个 Graph 的实例对象的 newNode 方法来创建。
val graph1: Graph = new Graphval node1: graph1.Node = graph1.newNodeval node2: graph1.Node = graph1.newNodeval node3: graph1.Node = graph1.newNodenode1.connectTo(node2)node3.connectTo(node1)
这里三个node都是graph1.Node类型。如果是非graph1.Node类型则无法编译成功。
val graph1: Graph = new Graphval node1: graph1.Node = graph1.newNodeval node2: graph1.Node = graph1.newNodenode1.connectTo(node2) // legalval graph2: Graph = new Graphval node3: graph2.Node = graph2.newNodenode1.connectTo(node3) // illegal!
那如果想达到和java中内部内中一样的效果,不区分路径该怎么办呢?使用Graph#Node即可。
class Graph {class Node {var connectedNodes: List[Graph#Node] = Nildef connectTo(node: Graph#Node) {if (!connectedNodes.exists(node.equals)) {connectedNodes = node :: connectedNodes}}}var nodes: List[Node] = Nildef newNode: Node = {val res = new Nodenodes = res :: nodesres}}
