Scala StringBuilder

#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 .