加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中类型参数的默认值

发布时间:2020-12-16 18:59:31 所属栏目:安全 来源:网络整理
导读:我无法弄清楚(如果有的话),您可以在 Scala中为类型参数设置默认值. 目前我有一个类似于此的方法: def getStage[T : Stage](key: String): T = { // Do fancy stuff that returns something} 但是我想做的是提供getStage的实现,它不会对T使用任何值,而是使用
我无法弄清楚(如果有的话),您可以在 Scala中为类型参数设置默认值.
目前我有一个类似于此的方法:

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)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读