2011-12-07 23 views
3

我在Scala中使用JAXB進行編組和解組浮點(以及整數)的問題。如何將浮點作爲Scala選項[Float]而不是具有JAXB的Java Float取消/組織?

在我的Scala應用程序我有變量是這樣的:

val taxPaid: Option[Float] 

如果taxPaid等於0.0f,這意味着沒有納稅;如果taxPaid等於None,那麼這意味着我們不知道支付了多少稅。

Option[Float]這樣的變量可以很好地映射到一個SQL float NULL列(我使用Squeryl),同樣它也可以在JSON或XML中很好地表達。我的問題是JAXB - 得到JAXB的工作,我的POJO表示內我都用簡單的Java Floats,就像這樣:

@XmlElement(nillable = true, `type` = classOf[Object]) 
@BeanProperty 
var taxPaid: Float = _ 

然後,因爲一個Java Float不能採取null的值時, 0.0f的值被視爲null的(不正確且有損)代理。

所以我的問題是:是否有一種方法,我可以馬歇爾和unmarshall XML浮動到Scala Option[Float],從而保持null的意義?

+4

Java'Float'可以取值爲null,原始'float'不能。 –

+0

謝謝Ingo - 您的評論指出了我在這一方面的正確方向(見下文) –

回答

1

英戈的評論把我領到了正確的方向 - 問題是,Scala的Float不能(大概是爲了鼓勵None習慣用法)設置爲null,而一個Java Float可以:

scala> val nf:java.lang.Float = null 
nf: java.lang.Float = null 

scala> val nf:Float = null 
<console>:7: error: type mismatch; 
found : Null(null) 
required: Float 
Note that implicit conversions are not applicable because they are ambiguous: 
both method Float2floatNullConflict in class LowPriorityImplicits of type (x:  Null)Float 
and method Float2float in object Predef of type (x: java.lang.Float)Float 
are possible conversion functions from Null(null) to Float 
     val nf:Float = null 
        ^

所以答案就是確保我的表述明確使用Java Floats

import java.lang.{Float => JFloat} 

@XmlElement(nillable = true, `type` = classOf[Object]) 
@BeanProperty 
var taxPaid: JFloat = _