Scala中类型参数的默认值

蜕皮的

我无法弄清楚如何(如果有的话)可以在Scala中类型-parameter设置默认值
目前,我有一个与此类似的方法:

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

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

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

}

我希望很清楚我要什么。有谁知道如何实现这样的目标?

特拉维斯·布朗

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

trait Default[A] { def apply(): A }

以及以下类型层次结构:

trait Stage
case class FooStage(foo: String) extends Stage
case class BarStage(bar: Int) extends Stage

还有一些实例:

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")
  }
}

然后,您可以这样编写方法:

def getStage[T <: Stage: Default](key: String): T =
  implicitly[Default[T]].apply()

它是这样的:

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

scala> getStage[BarStage]("")
res1: BarStage = BarStage(13)

我认为或多或少是您想要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章