#scala #stringbuilder #implicit-conversion
#scala #stringbuilder #неявное преобразование
Вопрос:
Существует ли неявный метод для преобразования scala.collection.mutable.StringBuilder для java.lang.StringBuilder?
Я использую библиотеку Java (JCommander), в которой один из методов ( usage
) принимает java.jang.StringBuilder
аргумент.
Ответ №1:
Вы не можете начать со 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), вы можете безопасно смешивать и сопоставлять использование двух.
Ответ №2:
Глядя на исходный код, кажется, что нет абсолютно никакого способа получить java.lang.StringBuilder
из scala.collection.mutable.StringBuilder
a .
Вы можете создать новый java.lang.StringBuilder
с помощью Scala, выполнив преобразование некоторого типа ( String
или CharSequence
).
Ответ №3:
Используйте это неявное преобразование, сделайте это:
implicit def b2b(b: scala.collection.mutable.StringBuilder) =
new java.lang.StringBuilder(b)
Комментарии:
1. На самом деле, я не думаю, что это сработает. Я предполагаю, что любой метод Java, который ожидает
java.lang.StringBuilder
, ожидает его изменения и разрешает вызывающему доступ к этим изменениям.implicit
Метод, который вы показываете, создает «защитную» копиюscala.collection.mutable.StringBuilder
. Любые изменения в вызываемом методе не будут отражены вscala.collection.mutable.StringBuilder
. Теперь, когда я думаю об этом, единственный способ, которым это могло быть реализовано, — этоscala.collection.mutable.StringBuilder
расширить или обернутьjava.lang.StringBuilder
.