如何在 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`
基本上你想要的是这样的
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)
我正在编写一个简单的 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`
基本上你想要的是这样的
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)