gpt4 book ai didi

scala - Scala 中类型参数的默认值

转载 作者:行者123 更新时间:2023-12-03 02:42:14 25 4
gpt4 key购买 nike

我无法弄清楚如何(如果有的话)在 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 = {

}

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

最佳答案

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

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 - Scala 中类型参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29414121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com