9

Scala には倍精度数の 2 つの表現があり、1 つは 、もう 1 つはAnyValですAnyRefdoubleJVM では、それらはそれぞれプリミティブとクラスにマップされjava.lang.Doubleます。

JVM 以外のプラットフォームではどうなるでしょうか。プリミティブに使用できますScala.Doubleが、指定せずにボックス化された Double への参照が必要であることを指定するにはどうすればよいjava.lang.Doubleですか?


[コンテキスト - Thomasz の回答を理解するために残されましたが、根本的な問題ではありません。

Spring で Wicket コンポーネントに挿入したい Double があります。

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== doubleJava で。をボックス化する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。double の単なるエイリアスです。したがって、問題については、を使用するjava.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 に答える