如何在纯Scala中表示盒装Double?

时间:2011-10-10 21:02:30

标签: scala autoboxing

在Scala中,有两个双精度数字表示,一个是AnyVal,另一个是AnyRef。在JVM上,它们分别映射到原始double和类java.lang.Double

现在在JVM以外的平台上会发生什么?我可以使用Scala.Double作为基元,但是如何指定我想要引用加框的Double而不指定java.lang.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呢? ]

2 个答案:

答案 0 :(得分:11)

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代码,需要autoboxing&拆箱将按预期工作。

如果它有所作为,你可以随时做:

type BoxedDouble = java.lang.Double

然后你将不必看到java.lang: - )

答案 1 :(得分:0)

为什么不创建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>