是否有隱式方法將scala.collection.mutable.StringBuilder轉換爲java.lang.StringBuilder?Scala StringBuilder
我正在使用其中一種方法(usage
)採用java.jang.StringBuilder
參數的Java庫(JCommander)。
是否有隱式方法將scala.collection.mutable.StringBuilder轉換爲java.lang.StringBuilder?Scala StringBuilder
我正在使用其中一種方法(usage
)採用java.jang.StringBuilder
參數的Java庫(JCommander)。
你不能用開始用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) - 斯卡拉包裝不存儲任何狀態(而不是僅僅指的是Java版本),你」重新安全地混合使用這兩者。
使用這種隱含的轉換做這樣做:
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
)。
其實,我認爲這不會奏效。我認爲任何期望java.lang.StringBuilder的Java方法都希望修改它並允許調用者訪問這些更改。你顯示的隱式方法創建了一個「scala.collection.mutable.StringBuilder」的「防禦」副本。被調用方法的任何改變都不會**反映在'scala.collection.mutable.StringBuilder'中。現在我想到了,它可以實現的唯一方法是如果'scala.collection.mutable.StringBuilder'擴展或包裝'java.lang.StringBuilder'。 – Ralph 2011-06-01 14:43:01