Scala中类型参数的默认值

evo*_*pid 16 generics scala

我没有弄清楚如何(如果有的话)你可以在Scala中为type -parameter 设置默认值.
目前我有一个类似于此的方法:

def getStage[T <: Stage](key: String): T = {
  // Do fancy stuff that returns something
}
Run Code Online (Sandbox Code Playgroud)

但我想要做的是提供一个getStage没有任何价值的实现T,而是使用默认值.我试图定义另一个方法并重载参数,但它只导致其中一个方法被另一个方法完全覆盖.如果我不清楚我想要做的是这样的事情:

def getStage[T<:Stage = Stage[_]](key: String): T = {

}
Run Code Online (Sandbox Code Playgroud)

我希望很清楚我要求的是什么.有谁知道这样的事情是如何实现的?

Tra*_*own 25

您可以使用类型类以类型安全的方式执行此类操作.例如,假设您有这个类型类:

trait Default[A] { def apply(): A }
Run Code Online (Sandbox Code Playgroud)

以下类型层次结构:

trait Stage
case class FooStage(foo: String) extends Stage
case class BarStage(bar: Int) extends Stage
Run Code Online (Sandbox Code Playgroud)

还有一些例子:

trait LowPriorityStageInstances {
  implicit object barStageDefault extends Default[BarStage] {
    def apply() = BarStage(13)
  }
}

object Stage extends LowPriorityStageInstances {
  implicit object stageDefault extends Default[Stage] {
    def apply() = FooStage("foo")
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样编写你的方法:

def getStage[T <: Stage: Default](key: String): T =
  implicitly[Default[T]].apply()
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下:

scala> getStage("")
res0: Stage = FooStage(foo)

scala> getStage[BarStage]("")
res1: BarStage = BarStage(13)
Run Code Online (Sandbox Code Playgroud)

我认为或多或少是你想要的.

  • 谢谢你。:) Tbh 似乎比我预期的要复杂一些,但我想我只需要更多地习惯类型类的概念。 (2认同)
  • 好答案。请问您是否共享指向“ T &lt;:Stage:Default”(双精度类型参数)的更多信息的链接? (2认同)