2011-10-10 6 views
7

Scalaには、倍精度数値の2つの表現があり、1つはAnyVal、もう1つはAnyRefです。 JVM上では、それらはプリミティブdoubleおよびクラスjava.lang.Doubleにそれぞれマップされます。純粋なScalaでboxed Doubleをどのように表現できますか?

JVM以外のプラットフォームではどうなりますか?プリミティブにはScala.Doubleを使用できますが、java.lang.Doubleを指定せずにboxed Doubleへの参照を指定するにはどうすればよいですか?


[文脈 - トーマスの答えを理解するために残したが、基本的な問題ではない。私は上記のようscala.Doubleとしてのタイプを指定した場合、それはオブジェクトのみを注入できるよう

class MyPanel(id: String) extends Panel(id) { 
    @SpringBean(name="rxAlarmLimitDb") var alarmLimitDb: Double = _ 

、インジェクタは、失敗します。

は、私はWicketのコンポーネントに春を注入したいダブルを持っています。

私は、フィールドのタイプとしてjava.lang.Doubleを指定すると、すべてがうまく

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

ですが、私は、JavaのAPIにフォールバックに私の依存を軽減しようとしているので、どのように私は箱入りDoubleを表しますそれなしで? ]

+1

:-)れるjava.langを参照してくださいする必要がありません

type BoxedDouble = java.lang.Double 

私の推測では、*ダブル箱入り*があるということです'java.lang.Double' - Scalaは他の多くのもの(AnyRef = java.lang.Object、String = java.lang.String)に対してJavaクラスを使用するのと同様です。私は確かに、わからない。 – Owen

+0

@あなたは正しいですか? –

+2

これらのステートメントは、JVMに当てはまります。 CLRには異なるマッピングがあります。ボックスド・ダブルの表現方法も知りたいです。 –

答えて

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> 
+0

私の問題はjava.Lang.Doubleで解決されると思いますが、私は不思議です! –

9

scala.Double == doubleを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 

タイプscala.Doubleのオブジェクトを作成する方法はありません。それは単なるダブルのエイリアスです。したがって、問題の場合は、java.lang.Doubleを使用するか、独自のタイプで囲み、暗黙的な変換を行う必要があります。

この定義は、それについて考えると意味があります。 autoboxingを必要とするJava &スケーラコード間の相互作用はすべて、期待通りに動作しません。

それが違いを作る場合、あなたはいつでも行うことができます。そして、あなたは

+2

これらのステートメントはすべてJVMではtrueですが、Scalaは他の環境を対象としています。 –

+0

私のPOVから、型エイリアスを作成する最後のセクションで@ DuncanMcGregorの問題を解決します。 – vadipp

関連する問題