Scala Seq - 如何使用Seq的替代方法解决重载的方法值

时间:2016-10-16 08:55:11

标签: scala

我的功能如下:

def foo(sequence: Seq): Unit = {
    ...
    bar.select(sequence);
}

我收到了错误overloaded method value select with alternatives。我是Scala语法的新手,我不知道确切的术语,所以我一直在网上搜索没有任何结果。

特别是,Scala似乎对我调用的select方法中的哪一个感到困惑。从文档中,有2个select方法(来源:https://spark.apache.org/docs/1.5.2/api/scala/index.html#org.apache.spark.sql.DataFrame

我尝试了以下内容,但也许是因为我对语法不熟悉,我无法成功:

bar.select(sequence.asInstanceOf[Seq[Column]]);

如何告诉Scala我希望它使用select(cols: Column*)而不是替代品?如果它没问题,答案可能包括这个概念 - 只是这样我可以正确地标记它,并学习新的东西。

1 个答案:

答案 0 :(得分:1)

声明您的foo方法并使用_*。如下图所示

def foo(sequence: Seq[Column]): Unit = {
    bar.select(sequence: _*)
}

解释select采用var args。当你想将Seq传递给一个接受var args的方法时,你必须明确地说_*所以编译器可以接受Seq作为var args。

Scala REPL示例

scala> def foo(a: Int*) = 1
foo: (a: Int*)Int

scala> foo(Seq(1, 2))
<console>:13: error: type mismatch;
 found   : Seq[Int]
 required: Int
       foo(Seq(1, 2))
              ^

scala> foo(Seq(1, 2): _*)
res1: Int = 1

通知调用foo(Seq(1, 2)给出编译错误如果我们通过明确地将类型明确指定为_*

来指导编译器,则可以修复此错误