Scala StringBuilder
是否有隐式方法将scala.collection.mutable.StringBuilder转换为java.lang.StringBuilderScala StringBuilder,scala,stringbuilder,implicit-conversion,Scala,Stringbuilder,Implicit Conversion,是否有隐式方法将scala.collection.mutable.StringBuilder转换为java.lang.StringBuilder 我正在使用一个Java库(JCommander),其中一个方法(用法)使用一个Java.jang.StringBuilder参数。使用此隐式转换执行以下操作: implicit def b2b(b: scala.collection.mutable.StringBuilder) = new java.lang.StringBu
我正在使用一个Java库(JCommander),其中一个方法(
用法
)使用一个Java.jang.StringBuilder
参数。使用此隐式转换执行以下操作:
implicit def b2b(b: scala.collection.mutable.StringBuilder) =
new java.lang.StringBuilder(b)
查看源代码,似乎绝对无法从
scala.collection.mutable.StringBuilder
中获取java.lang.StringBuilder
您可以使用Scala创建一个新的java.lang.StringBuilder
,进行某种类型的转换(String
或CharSequence
)。您不能从ScalaStringBuilder
开始,然后获得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版本),所以您可以安全地混合和匹配这两种用法。事实上,我认为这行不通。我假设任何需要
Java.lang.StringBuilder
的Java方法都需要修改它,并允许调用方访问这些更改。您显示的implicit
方法创建scala.collection.mutable.StringBuilder的“防御”副本。调用方法中的任何更改都不会反映在scala.collection.mutable.StringBuilder
中。现在我考虑一下,实现它的唯一方法是ifscala.collection.mutable.StringBuilder
扩展或包装java.lang.StringBuilder
。