如何在 Scala 中将一个 class 隐式转换为另一个

How to implicitly convert one class to another in Scala

我正在编写一个简单的 class、BooleanChar,用于将布尔值包装在 Oracle 的 Char 中(因为 Oracle is stupid or, TL;DR Oracle SQL does not support booleans)。

所以,我有模型 classes(将使用 BooleanChar)。我还有投影 classes,或映射到 REST 等的对象,它们将使用 Boolean.

示例(做作且简单但切中要点):

val first: String = "Fred"
val last: String = "Flintstone"
val active: BooleanChar = BooleanChar(true)

val m = UserModel(first, last, active)
... // stuff happens and now I want to project it over REST
val u = User(m.first, m.last, m.active)

现在,诀窍是,我希望 m.active 的映射(模型上的 BooleanChar 或投影上的 Boolean )完全透明.因此,如果这两个 classes 是可以互换的,上面的工作非常好,即使:

case class User(first: String, last: String, active: Boolean)

但这一切都取决于两种类型对象之间的神奇映射,例如 a: BooleanChar = b: Boolean 在某种程度上。否则,我必须在所有地方都这样做,而且很难看:

val u = User(first, last, active.map(_.state)) // BooleanChar has a `Boolean` `state`

查看 Pimp My Library pattern:

基本上你想要的是这样的

class BooleanCharToBool(bc: BooleanChar) {
    def toBool = bc.map(_.state)
}

implicit def booleanCharToBool(bc: BooleanChar) = new BooleanCharToBool(bc)

一旦将其导入到要进行转换的范围(构造 User 的位置),编译器将注意到有一种方法可以将 BooleanChar 隐式转换为布尔值,你将能够做到

val u = User(first, last, active)