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

Dun*_*gor 9 autoboxing scala

在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 = _
Run Code Online (Sandbox Code Playgroud)

如果我scala.Double按上面指定类型,则注入器失败,因为它只能注入对象.

如果我指定java.lang.Double字段的类型,一切都很好

class MyPanel(id: String) extends Panel(id) {
  @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: java.lang.Double = _
Run Code Online (Sandbox Code Playgroud)

但是我试图减少我对Java API的依赖,那么如何在Double没有它的情况下代表盒装呢?]

Mat*_*ell 11

scala.Doubledouble在Java中== .当你装箱时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
Run Code Online (Sandbox Code Playgroud)

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

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

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

type BoxedDouble = java.lang.Double
Run Code Online (Sandbox Code Playgroud)

那你就不用看java.lang了:-)

  • 所有这些陈述在JVM上都是正确的,但Scala针对其他环境. (2认同)

Tom*_*icz 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>
Run Code Online (Sandbox Code Playgroud)