Scala中的密封特征类转换

时间:2017-04-12 18:27:58

标签: java scala

如何从scala中的扩展类获取基类。实际上,我是Scala的新手,并尝试使用密封特征类编写一些编码。

例如,我有一个密封的跟踪类,一些案例类扩展到密封的跟踪类。

例如:

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])]

例如1:我正在尝试以下方法:

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进行反向操作? 一个例子将帮助我理解我的项目,请提供给我的建议。

2 个答案:

答案 0 :(得分:1)

您应该将返回类型注释添加到您的方法中,它有助于明确返回的类型,并让您更好地控制类型,而不是将其留给推理器,因为更改类型是什么的一个重要部分你试图做到这一点变得更加重要。

您的example1有几个问题。首先,你没有返回一个值,所以返回类型是Unit,它不是你想要的。删除val res =,以便返回地图的结果。如果您添加了返回类型,编译器可能会为您捕获此类型。如果还没有处理RDD中的Person不是Employee的情况,那么你需要考虑在这种情况下要做什么(过滤掉那些记录或者输入defautl值都是合理的选择,但你可能会想要别的东西。

在示例2中因为您需要更通用的类型,所以不需要进行任何类型的检查或转换。

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

雇主是人的子类型,List是协变的,因此List [Employer]是List [Person]的子类型,因此您可以在需要List [Person]的任何地方使用List [Employer]。

答案 1 :(得分:0)

这样的东西对你有两种数据类型:

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