在scala中使用不同类型参数的Varargs

时间:2013-07-21 16:55:59

标签: scala types variadic-functions

我是Scala的新手......

无论如何,我想做点什么:

val bar = new Foo("a" -> List[Int](1), "b" -> List[String]("2"), ...)
bar("a") // gives List[Int] containing 1
bar("b") // gives List[String] containing "2"

我这样做的问题:

class Foo(pairs: (String, List[_])*) {
  def apply(name: String): List[_] = pairs.toMap(name)
}

pairs将是Array [(String,List [Any])(或类似的东西),apply()无论如何都是错误的,因为List[_]是一种类型而不是&#34 ;不同类型"。即使varargs *返回了一个元组,我仍然不确定如何让bar("a")返回List[OriginalTypePassedIn]。实际上有这样做的方法吗? Scala似乎非常灵活,所以感觉应该有一些先进的方法。

2 个答案:

答案 0 :(得分:2)

没有

这就是静态类型系统的本质:一种方法具有固定的返回类型。它不能依赖于方法参数的值,因为参数在编译时是未知的。假设您有bar,它是Foo的一个实例,并且您不知道它是如何实例化的。你打电话给bar("a")。您将获得正确类型的实例,但由于该类型直到运行时才确定,因此编译器无法知道它。

但是,Scala确实为您提供了一种方便的语法来分类Foo

object bar extends Foo {
  val a = List[Int](1)
  val b = List[String]("2")
}

答案 1 :(得分:1)

这不可能。考虑一下:

val key = readStringFromUser();
val value = bar(key);

value的类型是什么?这取决于用户输入的内容。但是类型是静态的,它们是在编译时确定并使用的。

所以你要么必须在编译时使用固定数量的参数,要么在编译时知道它们的类型,要么使用通用的vararg并在运行时进行类型转换。