Scala 中类型参数的默认值
Default value for type parameter in Scala
我没弄明白如何(如果有的话)在 Scala 中为 type 参数设置默认值。
目前我有一个类似这样的方法:
def getStage[T <: Stage](key: String): T = {
// Do fancy stuff that returns something
}
但我想做的是提供 getStage
的实现,它不为 T
取值,而是使用默认值。我试图只定义另一个方法并重载参数,但这只会导致其中一个方法被另一个方法完全覆盖。如果我不清楚我想做的是这样的:
def getStage[T<:Stage = Stage[_]](key: String): T = {
}
我希望我的要求很清楚。有谁知道这样的事情是如何实现的?
您可以使用类型 classes 以类型安全的方式执行此类操作。例如,假设您有这种类型 class:
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)
我认为这或多或少是你想要的。
我没弄明白如何(如果有的话)在 Scala 中为 type 参数设置默认值。
目前我有一个类似这样的方法:
def getStage[T <: Stage](key: String): T = {
// Do fancy stuff that returns something
}
但我想做的是提供 getStage
的实现,它不为 T
取值,而是使用默认值。我试图只定义另一个方法并重载参数,但这只会导致其中一个方法被另一个方法完全覆盖。如果我不清楚我想做的是这样的:
def getStage[T<:Stage = Stage[_]](key: String): T = {
}
我希望我的要求很清楚。有谁知道这样的事情是如何实现的?
您可以使用类型 classes 以类型安全的方式执行此类操作。例如,假设您有这种类型 class:
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)
我认为这或多或少是你想要的。