Scala:传递基于相同类型的参数时出现类型不匹配错误

问题描述 投票:0回答:0

我有一个基本的 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
}
scala apache-spark implicit
© www.soinside.com 2019 - 2024. All rights reserved.