问题 Scala StringBuilder


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

我正在使用Java库(JCommander)中的一种方法(usage拿一个 java.jang.StringBuilder 论据。


3112
2018-06-01 13:00


起源



答案:


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

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版本),你可以安全地混合使用二。


9
2018-06-01 16:03





看一下源代码,似乎绝对没有办法得到一个 java.lang.StringBuilder 从一个 scala.collection.mutable.StringBuilder

你可以创建一个新的 java.lang.StringBuilder 与Scala一起,经历某种类型的转换(String 要么 CharSequence)。


4
2018-06-01 14:36





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

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

1
2018-06-01 13:31



实际上,我认为这不会起作用。我认为任何期望的Java方法 java.lang.StringBuilder 期望修改它并允许调用者访问这些更改。该 implicit 你展示的方法创造了一个“防御性”的副本 scala.collection.mutable.StringBuilder。被调用方法的任何变化都会 不 反映在 scala.collection.mutable.StringBuilder。现在我考虑一下,它实现的唯一方法就是if scala.collection.mutable.StringBuilder 延长或包裹 java.lang.StringBuilder。 - Ralph


答案:


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

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版本),你可以安全地混合使用二。


9
2018-06-01 16:03





看一下源代码,似乎绝对没有办法得到一个 java.lang.StringBuilder 从一个 scala.collection.mutable.StringBuilder

你可以创建一个新的 java.lang.StringBuilder 与Scala一起,经历某种类型的转换(String 要么 CharSequence)。


4
2018-06-01 14:36





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

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

1
2018-06-01 13:31



实际上,我认为这不会起作用。我认为任何期望的Java方法 java.lang.StringBuilder 期望修改它并允许调用者访问这些更改。该 implicit 你展示的方法创造了一个“防御性”的副本 scala.collection.mutable.StringBuilder。被调用方法的任何变化都会 不 反映在 scala.collection.mutable.StringBuilder。现在我考虑一下,它实现的唯一方法就是if scala.collection.mutable.StringBuilder 延长或包裹 java.lang.StringBuilder。 - Ralph