溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

scala的內(nèi)部類怎么使用

發(fā)布時間:2021-12-08 15:02:44 來源:億速云 閱讀:139 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“scala的內(nèi)部類怎么使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“scala的內(nèi)部類怎么使用”吧!

在Scala中,一個類可以作為另一個類的成員。 在一些類似 Java 的語言中,內(nèi)部類是外部類的成員,而 Scala 正好相反,內(nèi)部類是綁定到外部對象的。 假設(shè)我們希望編譯器在編譯時阻止我們混淆節(jié)點(diǎn) nodes 與圖形 graph 的關(guān)系,路徑依賴類型提供了一種解決方案。

為了說明差異,我們簡單描述了一個圖形數(shù)據(jù)類型的實(shí)現(xiàn):

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  }}

該程序?qū)D表示為節(jié)點(diǎn)列表 (List[Node])。 每個節(jié)點(diǎn)都有一個用來存儲與其相連的其他節(jié)點(diǎn)的列表 (connectedNodes)。 類 Node 是一個 路徑依賴類型,因為它嵌套在類 Graph 中。 因此,connectedNodes 中存儲的所有節(jié)點(diǎn)必須使用同一個 Graph 的實(shí)例對象的 newNode 方法來創(chuàng)建。

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)

為清楚起見,我們已經(jīng)明確地將 node1,node2,和 node3 的類型聲明為graph2.Node,但編譯器其實(shí)可以自動推斷出它。 這是因為當(dāng)我們通過調(diào)用 graph2.newNode 來調(diào)用 new Node 時,該方法產(chǎn)生特定于實(shí)例 graph2Node 類型的實(shí)例對象。

如果我們現(xiàn)在有兩個圖,Scala 的類型系統(tǒng)不允許我們將一個圖形中定義的節(jié)點(diǎn)與另一個圖的節(jié)點(diǎn)混合,因為另一個圖形的節(jié)點(diǎn)具有不同的類型。下例是一個非法的程序:

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 中,上一個示例程序中的最后一行是正確的。對于兩個圖的節(jié)點(diǎn),Java 將分配相同的類型 Graph.Node; 即 Node 以類 Graph 為前綴。在Scala中也可以表示出這種類型,它寫成了 Graph#Node。如果我們希望能夠連接不同圖形的節(jié)點(diǎn),我們必須通過以下方式更改圖類的初始實(shí)現(xiàn)的定義:

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的內(nèi)部類怎么使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對scala的內(nèi)部類怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI