【问题标题】:Scala StringBuilderScala StringBuilder
【发布时间】:2011-06-01 13:00:18
【问题描述】:

是否有将 scala.collection.mutable.StringBuilder 转换为 java.lang.StringBuilder 的隐式方法?

我正在使用 Java 库 (JCommander),其中方法之一 (usage) 采用 java.jang.StringBuilder 参数。

【问题讨论】:

    标签: scala stringbuilder implicit-conversion


    【解决方案1】:

    您不能开始使用 Scala StringBuilder 然后获取 Java 版本。但是,您可以在 Scala 版本中包装 java.lang.StringBuilder。所以:

    val jsb = new java.lang.StringBuilder();
    val sb = new StringBuilder(jsb);
    // Do Scala-y stuff with sb
    JCommander.whatever.usage(jsb);
    // Do more Scala-y stuff
    

    因为——不是保证,但现在在实践中是正确的(2.8、2.9)——Scala 包装器不存储任何状态(而只是指 Java 版本),你可以安全地混合和匹配两者的用法。

    【讨论】:

      【解决方案2】:

      查看源代码,似乎绝对没有办法从scala.collection.mutable.StringBuilder 中获取java.lang.StringBuilder

      您可以使用 Scala 创建一个新的 java.lang.StringBuilder,通过某种类型的转换(StringCharSequence)。

      【讨论】:

        【解决方案3】:

        使用此隐式转换执行以下操作:

            implicit def b2b(b: scala.collection.mutable.StringBuilder) = 
                new java.lang.StringBuilder(b)
        

        【讨论】:

        • 实际上,我认为这行不通。我假设任何需要 java.lang.StringBuilder 的 Java 方法都希望修改它并允许调用者访问这些更改。您展示的implicit 方法创建了scala.collection.mutable.StringBuilder 的“防御性”副本。被调用方法中的任何更改不会反映在scala.collection.mutable.StringBuilder 中。现在我想起来了,它可以实现的唯一方法是 scala.collection.mutable.StringBuilder 扩展或包装 java.lang.StringBuilder
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2012-10-25
        • 2011-11-24
        • 2013-09-05
        相关资源
        最近更新 更多