【问题标题】:Varargs with different type parameters in scalascala中具有不同类型参数的可变参数
【发布时间】:2013-07-22 01:38:11
【问题描述】:

我是 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[_] 是一种类型而不是“不同类型”。即使 varargs * 返回了一个元组,我仍然不确定如何让bar("a") 返回一个List[OriginalTypePassedIn]。那么实际上有没有办法做到这一点? Scala 看起来非常灵活,所以感觉应该有一些高级的方法来做到这一点。

【问题讨论】:

标签: scala types variadic-functions


【解决方案1】:

没有。

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

然而,Scala 确实为您提供了一种方便的语法来对Foo 进行子类型化:

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

【讨论】:

    【解决方案2】:

    这是不可能的。考虑一下:

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

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

    因此,您要么必须使用在编译时知道其类型的固定数量的参数,要么使用通用 vararg 并在运行时进行类型转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多