2011-06-01 67 views
11

是否有隱式方法將scala.collection.mutable.StringBuilder轉換爲java.lang.StringBuilder?Scala StringBuilder

我正在使用其中一種方法(usage)採用java.jang.StringBuilder參數的Java庫(JCommander)。

回答

9

你不能用開始用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版本),你」重新安全地混合使用這兩者。

1

使用這種隱含的轉換做這樣做:

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

其實,我認爲這不會奏效。我認爲任何期望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

4

查看源代碼,似乎有絕對沒有辦法從scala.collection.mutable.StringBuilder得到java.lang.StringBuilder

您可以使用Scala創建一個新的java.lang.StringBuilder,通過某種類型的轉換(StringCharSequence)。