Scala:如何将varargs指定为类型?

时间:2010-03-15 10:04:53

标签: scala types

而不是

def foo(configuration: (String, String)*)

我希望能够写下:

type Configuration =  (String, String)*
def foo(configuration: Configuration)

主要用例是在覆盖子类时提供简单的方法签名

更新:

我可以近在咫尺
type Param = (String, String)
def foo(configuration: Param*)

但有没有办法做得更好?

3 个答案:

答案 0 :(得分:9)

不,*仅允许用于ParamType,即匿名函数或方法的参数类型。

  

4.6.2重复参数语法:ParamType :: = Type''最后一个值   参数部分的参数可以   以“”为后缀,例如(...,x:T *)。   这种重复参数的类型   然后在方法内部的序列   输入scala.Seq [T]。方法用   重复参数T *取一个   类型为T的可变数量的参数。

编译器错误@Eastsun的例子是在第一行,而不是第二行。这不应该被允许:

scala> type VarArgs =  (Any*)
defined type alias VarArgs

我提出了bug

这与By-Name Parameters类似。在这种情况下,编译器会阻止创建类型别名:

scala> type LazyString = (=> String) <console>:1: error: no by-name parameter type allowed here
       type LazyString = (=> String)

您的最后一次尝试是表达此事的标准方式。

答案 1 :(得分:2)

我认为你可以使用

type Configuration =  ((String, String)*)
def foo(configuration: Configuration)

但它使编译器崩溃(2.8.0.r21161-b20100314020123)。这似乎是scala编译器的一个错误。

答案 2 :(得分:1)

您可以将其定义为

type Param = (String, String)
type Configuration = Seq[Param]

def foo(configuration : Configuration)

用户必须构造Seq实例

foo(List("1"->"2"))

这不是最佳的。