簡體   English   中英

Scala中的密封特征類轉換

[英]Sealed trait class conversion in Scala

如何從Scala的擴展類中獲取基類。 實際上,我是Scala的新手,並嘗試使用密封的trait類編寫一些編碼。

例如,我有一個密封線索類,還有一些案例類擴展到了密封線索類。

例如:

sealed trait Person
case class Employer(name: String, id: Int, country: List[String]) extends Person
case class Employee(name: String, id: Int) extends Person

我正在尋找以下類型的示例:

type example1 = RDD[(String, Int, Person)] => RDD[((String, Int), Employee)]

type example2 = RDD[(String, Int, List[Employer])] => RDD[((String, Int), List[Person])]

例如:我正在嘗試以下操作:

def getType1(data: RDD[(String, Int, Person)]) = {
   val res = data.map {
       x => {
         val emp = x._3.asInstanceOf[Employee]
         ((x._1, X._2), Employee(emp.name, emp.id)
         )
       }
   }
}

但是如何對example2類型進行相反操作? 一個例子可以幫助我理解我的項目,請為我提供建議。

您應該在方法中添加return type批注,這有助於弄清返回的是哪種類型,並使您可以更好地控制該類型,而不是將其留給推斷者,因為更改類型是您嘗試的很大一部分做到這一點變得更加重要。

您的example1有幾個問題。 首先,您沒有返回任何值,因此返回類型為Unit,這不是您想要的。 刪除val res =以便您返回地圖的結果。 如果添加了返回類型,則編譯器可以為您捕獲該類型。 如果還不能解決RDD中的人員不是雇員的情況,則需要考慮在這種情況下該怎么做(過濾掉這些記錄或設置為defautl值都是合理的選擇,但是您可能想要一些東西其他。

在示例2中,由於您需要更通用的類型,因此無需執行任何檢查或強制轉換。

def example2(data: RDD[(String, Int, List[Employer])]): RDD[((String, Int), List[Person])] = data.map { x => ((x._1, x._2), x._3)}

Employer是人員的子類型,而List是協變的,因此List [Employer]是List [Person]的子類型,因此您可以在需要List [Person]的任何地方使用List [Employer]。

像這樣的東西對兩種數據類型都適用:

def getType1(data: RDD[(String, Int, Person)]) : RDD[((String, Int),Person)] = {
  data.map { case (s, i, person) => ((s, i), person)}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM