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

时间:2015-09-16 01:20:10

标签: oracle scala mapping

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

所以,我有模型类(将使用Boolean)。我还有投影类,或映射到REST等的对象,它们将使用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或投影上的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` 。否则,我必须在整个地方做到这一点,这很难看:

{
  "data": {
    "children": [{
      "data": {
        "domain": "some.url.com"
      },
      {
        "data": {
          "domain": "another.url.com"
        }
      }
    }]
  }
}

1 个答案:

答案 0 :(得分:3)

查看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)