在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
呢?
]
答案 0 :(得分:11)
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>