在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了:-)
为什么不创建一个类型的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)
| 归档时间: |
|
| 查看次数: |
3537 次 |
| 最近记录: |