【发布时间】:2011-06-01 13:00:18
【问题描述】:
是否有将 scala.collection.mutable.StringBuilder 转换为 java.lang.StringBuilder 的隐式方法?
我正在使用 Java 库 (JCommander),其中方法之一 (usage) 采用 java.jang.StringBuilder 参数。
【问题讨论】:
标签: scala stringbuilder implicit-conversion
是否有将 scala.collection.mutable.StringBuilder 转换为 java.lang.StringBuilder 的隐式方法?
我正在使用 Java 库 (JCommander),其中方法之一 (usage) 采用 java.jang.StringBuilder 参数。
【问题讨论】:
标签: scala stringbuilder implicit-conversion
您不能开始使用 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 版本),你可以安全地混合和匹配两者的用法。
【讨论】:
查看源代码,似乎绝对没有办法从scala.collection.mutable.StringBuilder 中获取java.lang.StringBuilder。
您可以使用 Scala 创建一个新的 java.lang.StringBuilder,通过某种类型的转换(String 或 CharSequence)。
【讨论】:
使用此隐式转换执行以下操作:
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。