我的功能如下:
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*)
而不是替代品?如果它没问题,答案可能包括这个概念 - 只是这样我可以正确地标记它,并学习新的东西。
答案 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)
给出编译错误如果我们通过明确地将类型明确指定为_*