簡體   English   中英

如何在純Scala中表示盒裝Double?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM