gpt4 book ai didi

java - Scala 中的密封特征类转换

转载 作者:行者123 更新时间:2023-12-02 13:25:54 25 4
gpt4 key购买 nike

如何从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 类型执行相反的操作呢?一个例子将帮助我理解我的项目,请为我提供建议。

最佳答案

您应该将返回类型注释添加到您的方法中,它有助于明确返回的类型,并让您更好地控制类型,而不是将其留给推断器,因为更改类型是其中的一个重要部分你正在努力去做的事情变得更加重要。

您的 example1 有几个问题。首先,您没有返回值,因此返回类型是 Unit 这不是您想要的。删除 val res = 以便返回映射结果。如果您添加了返回类型,编译器可以为您捕获它。如果也不能处理 RDD 中的人员不是员工的情况,您需要考虑在这种情况下该怎么做(过滤掉这些记录或放入默认值都是合理的选择,但您可能想要一些东西否则。

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

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

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

关于java - Scala 中的密封特征类转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43377032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com