我有一个基本的 Scala 问题:
我定义了一个自定义函数来添加到 Dataset[Row] 中,它允许我创建自己的 WrappedDataset 并使用隐式函数来实现:
class CustomFunctions(dataset: Dataset[Row]) {
def wrap(): WrappedDataset = {
new WrappedDataset(
inputDf = dataset,
)
}
}
object CustomFunctions {
implicit def addWrap(dataset: Dataset[Row]): CustomFunctions = new CustomFunctions(dataset)
}
我也正在使用这个案例对象来公开一个案例类以供在这里使用:
case object Singleton extends NRC {
def apply(x: TupleExpr): BagExpr = Singleton(x)
}
现在在实践中使用它时,我遇到了类型不匹配的问题:(请记住,这里的 flatMap 函数是一个自定义函数,它以 (f: TupleExpr => BagExpr) 作为参数 -> 问题在于参数Singleton() 调用的)
val ds: Dataset[Row] = simpleStringObject()
val e1: WrappedDataset = ds.wrap()
e1.flatMap(x => Singleton(x))
在最后一行我得到错误:
类型不匹配。要求:Singleton.TupleExpr,发现:e1.TupleExpr
TupleExpr 在实践中对于这两者是相同的,那么为什么 Scala 认为它是类型不匹配?
编辑: 我应该补充一点,一个快速解决方法是将 case 作为正确的实例类型,如下所示:
e1.flatMap(x => Singleton(x.asInstanceOf[Singleton.TupleExpr]))
但这不是一个合适的解决方案,因为我想找到问题的根源而不是每次都投射。
编辑2:
TupleExpr 只是一个 trait,它扩展了 trait Expr 并混合了另一个 trait AbstractTuple:
trait TupleExpr extends Expr with AbstractTuple {
def tp: TupleType
}