9

在 Scala 中,双精度数有 2 种表示形式,一种是AnyVal,另一种是AnyRef。在 JVM 上,它们分别映射到原语double和类java.lang.Double

现在在 JVM 以外的平台上会发生什么?我可以使用Scala.Double原语,但我如何指定我想要引用装箱的 Double 而不指定java.lang.Double


[上下文 - 留下来理解 Thomasz 的回答,但不是根本问题。

我有一个 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呢?]

4

2 回答 2

11

scala.Double==double在 Java 中。当你把 a 装箱时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

没有任何方法可以创建 type 的对象scala.Double。它只是双重的别名。因此,对于您的问题,您需要使用 ajava.lang.Double或将其包含在您自己的类型中并提供隐式转换。

如果你仔细想想,这个定义是有道理的。需要自动装箱和拆箱的 java 和 scala 代码之间的所有交互都将按预期工作。

如果它有所作为,你总是可以这样做:

type BoxedDouble = java.lang.Double

那么您将不必看到 java.lang :-)

于 2011-10-10T21:37:12.650 回答
0

为什么不创建一个 bean 类型scala.Double?可怕,但似乎它正在工作:

<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>
于 2011-10-10T21:20:51.087 回答