4

私はいくつかのJavaコードを移植しており、次のものがあります

val overnightChanges: java.util.Hashtable[String, Double] = ...

やってみると

if (null != overnightChanges.get(...))

次の警告が表示されます

警告: `!=' を使用して Null 型と Double 型の値を比較すると、常に true が返されます

4

3 に答える 3

14

プリミティブ型と参照型は、java よりも scala の方がはるかに違いが少ないため、名前はすべて大文字で始まるという慣習があります。Doubleこれはscala.Doubleプリミティブ Javadoubleであり、参照ではありませんjava.lang.Double

scala で「double または no value」が必要な場合は、Option[Double]ほとんどの場合使用します。Option には強力なライブラリ サポートがあり、型システムでは、値がない可能性があることを無視できません。ただし、例のように Java と密接に対話する必要がある場合は、テーブルに java.lang.Double が含まれているため、そのように言う必要があります。

val a = new java.util.HashMap[String, java.lang.Double]

コードのいたるところに表示されるようになった場合java.lang.Doubleは、インポートすることにより、JDouble にエイリアスできます。

import java.lang.{Double => JDouble}

または定義することによって

type JDouble = java.lang.Double 

scala.Doubleとの間に暗黙的な変換がjava.lang.Doubleあるため、相互作用は適度にスムーズになるはずです。ただし、java.lang.Doubleおそらく scala/java 相互作用レイヤーに限定する必要があります。scala コードに深く入り込むと混乱するでしょう。

于 2011-07-20T08:40:01.697 に答える
5

Scala では Double はプリミティブであるため、null にすることはできません。キーが定義されていない場合、デフォルトのプリミティブ値 (ここでは 0.0) が取得されるため、Java マップを直接使用する場合は面倒です。

scala>  val a = new java.util.Hashtable[String,Double]()
a: java.util.Hashtable[String,Double] = {}

scala> a.get("Foo")
res9: Double = 0.0

値が String や List などのオブジェクトである場合、コードは期待どおりに動作するはずです。

したがって、問題を解決するには、次のことができます。

  1. contains外側の if 条件で使用します。
  2. Scala マップの 1 つを使用します (多くの変換が で定義されていますscala.collection.JavaConversions) 。
于 2011-07-20T05:57:45.750 に答える
0

Haskellでは「たぶん」とも呼ばれるScalaの「オプション」を使用します。

http://blog.danielwellman.com/2008/03/using-scalas-op.html

于 2011-07-20T05:35:22.217 に答える