您好,登錄后才能下訂單哦!
這篇文章主要講解了“scala的內部類怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“scala的內部類怎么使用”吧!
在Scala中,一個類可以作為另一個類的成員。 在一些類似 Java 的語言中,內部類是外部類的成員,而 Scala 正好相反,內部類是綁定到外部對象的。 假設我們希望編譯器在編譯時阻止我們混淆節點 nodes 與圖形 graph 的關系,路徑依賴類型提供了一種解決方案。
為了說明差異,我們簡單描述了一個圖形數據類型的實現:
class Graph { class Node { 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 }}
該程序將圖表示為節點列表 (List[Node]
)。 每個節點都有一個用來存儲與其相連的其他節點的列表 (connectedNodes
)。 類 Node
是一個 路徑依賴類型,因為它嵌套在類 Graph
中。 因此,connectedNodes
中存儲的所有節點必須使用同一個 Graph
的實例對象的 newNode
方法來創建。
val graph2: Graph = new Graphval node1: graph2.Node = graph2.newNodeval node2: graph2.Node = graph2.newNodeval node3: graph2.Node = graph2.newNodenode1.connectTo(node2)node3.connectTo(node1)
為清楚起見,我們已經明確地將 node1
,node2
,和 node3
的類型聲明為graph2.Node
,但編譯器其實可以自動推斷出它。 這是因為當我們通過調用 graph2.newNode
來調用 new Node
時,該方法產生特定于實例 graph2
的 Node
類型的實例對象。
如果我們現在有兩個圖,Scala 的類型系統不允許我們將一個圖形中定義的節點與另一個圖的節點混合,因為另一個圖形的節點具有不同的類型。下例是一個非法的程序:
val graph2: Graph = new Graphval node1: graph2.Node = graph2.newNodeval node2: graph2.Node = graph2.newNodenode1.connectTo(node2) val graph3: Graph = new Graphval node3: graph3.Node = graph3.newNodenode1.connectTo(node3)
類型 graph2.Node
與類型 graph3.Node
完全不同。在 Java 中,上一個示例程序中的最后一行是正確的。對于兩個圖的節點,Java 將分配相同的類型 Graph.Node
; 即 Node
以類 Graph
為前綴。在Scala中也可以表示出這種類型,它寫成了 Graph#Node
。如果我們希望能夠連接不同圖形的節點,我們必須通過以下方式更改圖類的初始實現的定義:
class Graph { class Node { var connectedNodes: List[Graph#Node] = Nil def connectTo(node: Graph#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 }}
感謝各位的閱讀,以上就是“scala的內部類怎么使用”的內容了,經過本文的學習后,相信大家對scala的內部類怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。