[英]How do I represent the boxed Double in pure Scala?
在Scala中有兩個雙精度數的表示,一個是AnyVal
,另一個是AnyRef
。 在JVM上,它們分別映射到基本double
和類java.lang.Double
。
現在在JVM以外的平台上會發生什么? 我可以使用Scala.Double
作為原語,但是如何在不指定java.lang.Double
情況下指定我想要對盒裝Double進行引用?
[背景 - 留下來理解托馬斯的答案,但不是根本問題。
我有一個Double,我想將Spring注入Wicket組件:
class MyPanel(id: String) extends Panel(id) {
@SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: Double = _
如果我將類型指定為scala.Double
,如上所述,注入器將失敗,因為它只能注入對象。
如果我指定java.lang.Double
作為字段的類型,一切都很好
class MyPanel(id: String) extends Panel(id) {
@SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: java.lang.Double = _
但是我試圖減少我對Java API的依賴,那么如何在沒有它的情況下代表盒裝Double
呢? ]
Java中的scala.Double
== double
。 當您scala.Double
,它將成為java.lang.Double
。
scala> val f = 45d;
f: Double = 45.0
scala> println("f=" + f.getClass)
f=double
scala> def foo(d: Any) = println("d=" + d.getClass)
foo: (d: Any)Unit
scala> foo(f)
d=class java.lang.Double
沒有任何方法可以創建scala.Double
類型的對象。 它只是double的別名。 因此,對於您的問題,您需要使用java.lang.Double
,或將其包含在您自己的類型中並提供隱式轉換。
如果你仔細想想,這個定義是有道理的。 需要自動裝箱和取消裝箱的java和scala代碼之間的所有交互都將按預期工作。
如果它有所作為,你可以隨時做:
type BoxedDouble = java.lang.Double
那你就不用看java.lang了:-)
為什么不創建scala.Double
類型的bean? 可怕,但似乎它的工作:
<bean id="rxAlarmLimitDb" class="scala.Double" factory-method="unbox">
<constructor-arg>
<bean class="java.lang.Double">
<constructor-arg value="4.2"/>
</bean>
</constructor-arg>
</bean>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.