如何在 Scala 中使用泛型

how to use generics in Scala

我编写了这个组件,以在不同语言之间切换:

import scala.collection.mutable.Map

sealed trait Language
case object English extends Language {
  val messages: Map[String, String] =
    Map("M01" -> "Ready for cooking - press START",
      "M02" -> "Close the door to start cooking")
}
case object French extends Language {
  val messages: Map[String, String] =
    Map("M01" -> "Pret pour la cuisson - presse START",
      "M02" -> "Fermez la porte pour commencer la cuisson")
}

class Lang {

  //The default Language
  private var language: Language = English

  def chosen(lang: Language) = language = lang

  def displayMessage(msg: String) = language match {
    case English => English messages msg
    case French => French messages msg 
  }

}

我关心的是如何使用参数化来构建这样的组件,然后使用为其参数指定的不同语言对其进行配置?

您的代码看起来简单明了,我不确定泛型是否会改进它。

但是,您可以将 Lang 的实现移到语言中。您将不得不将语言对象作为方法参数传递,也许作为隐式传递。参数的类型将是 T < Language.

我可能宁愿坚持使用您的简单查找 table,但将 class Lang 更改为对象 Language,即 Language 特征的伴随对象。

我认为在这种情况下您真的不需要泛型。

另外...您的设计感觉有些不对劲。无论如何......如果你认为你有泛型的用例......你可以这样做。

稍微改变你的特质

sealed trait Language {
  val messages: Map[ String, String ]
}

现在像这样定义通用 class,

class Lang[ A <: Language ]( var language: A = English ) {

  def chosen( lang: A ): Unit = {
    language = lang
  }

  def displayMessage(msg: String): Unit = {
    language messages msg 
  }

}