【问题标题】:How to implicitly convert one class to another in Scala如何在Scala中将一个类隐式转换为另一个类
【发布时间】:2015-09-16 01:20:10
【问题描述】:

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

所以,我有模型类(将使用BooleanChar)。我还有投影类或映射到 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)的映射完全透明。因此,如果这两个类是可互换的,那么上面的工作就非常好,即使:

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`

【问题讨论】:

    标签: oracle scala mapping


    【解决方案1】:

    查看Pimp My Library pattern

    基本上你想要的是类似的东西

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

    一旦你将它导入到你想要进行转换的作用域(你在其中构造一个User),编译器会注意到有一种方法可以将 BooleanChar 隐式转换为 Boolean,你将能做到

    val u = User(first, last, active)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-10
      • 2011-03-02
      • 2018-06-13
      • 2011-03-02
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多