可变参数的多类型方法参数

Ame*_*ful 3 scala

让我们想象一个可以传递Any类型变量的方法。

def myMethod(input: Any*) = {
  input.foreach(println)
}

myMethod("q", "w", "e", 1, 2, 3, true, false, ...)
Run Code Online (Sandbox Code Playgroud)

Scala 是否允许限制类型,例如:only String Integer

Sil*_*olo 8

Scala 3 支持联合类型,这允许我们直接编码这个约束。

def myMethod(input: (String | Int)*) = {
  input.foreach(println)
}
Run Code Online (Sandbox Code Playgroud)

在 Scala 2 中,如果您稍微聪明一点,您仍然可以使用隐式来做到这一点。这称为磁铁图案。我们的想法是,我们将编写我们的方法的一个具体实现,它采用我们控制的特征的实例,称为我们的磁铁,然后我们将编写一堆隐式来获取我们真正关心的类型并将它们转换为我们的磁铁特质。

sealed trait MyMethodMagnet {
  def innerValue: Any
}

implicit class IntMagnet(override val innerValue: Int) extends MyMethodMagnet
implicit class StringMagnet(override val innerValue: String) extends MyMethodMagnet
Run Code Online (Sandbox Code Playgroud)

然后写入myMethod获取MyMethodMagnet实例,Scala 会自动将有效值转换为适当的类型。

def myMethod(input: MyMethodMagnet*) = {
  input.foreach { (x) => println(x.innerValue) }
}
Run Code Online (Sandbox Code Playgroud)

您仍然以同样的方式调用它,Scala 隐式地将所有内容包装在我们的磁铁类中。

myMethod(1, "A")
Run Code Online (Sandbox Code Playgroud)