5

2 つのパラメーターを取る Scala メソッドがあります。

def test(x:Long,y:Int){}

場合によっては、長いのではなく null を渡す必要があります...そのようなもの:

test(null,x)

結果:

scala> test(null,2) :7: エラー: タイプの不一致。見つかった: Null(null) 必要: 長いテスト(null,2)

null を渡す必要があるのはなぜですか? 実際、何らかの理由で、デフォルト値を渡すことができません。したがって、私はそのようなヌルが必要です。

*注: * ソリューションがオプションになることはわかっています。ただし、このメソッド シグネチャを制御できないとしましょう。回避策はありますか?

何か案は!

ありがとう。

4

3 に答える 3

8

Nullは、AnyValから継承する値型ではなく、AnyRefから継承する型のサブタイプです。これが、nullを渡すことができない理由です。これは、Javaでは、long型のnullを使用できないことに対応しています。(ボックス化されたLongタイプを無視します)。

ただし、これは、メソッドのシグネチャを次のように変更する必要があることを示しています。

def test(x: Option[Long], y: Int)

これは、xの値がなくなる場合があることを示しています。このインスタンスだけを処理するためのこの優れたOptionクラスがあるため、null値を使用する正当な理由はほとんどありません。開発者がnull値をチェックすることを覚えていることに依存しています。代わりに、Optionを使用すると、コンパイラは値が存在しない可能性があるという事実に注意を払うように強制します。

于 2012-11-30T02:00:36.460 に答える
3

署名を変更することはできないため、Option[Foo] is the only/most natural way to express a missing function argumentの誤りを考慮してください。

関数のパラメーターが下限である場合、Long.MinValue が自然なデフォルトになる可能性があります。

「何らかの理由で、デフォルト値を渡すことができない」(それが意味する可能性があるものは何でも)ということは、署名にデフォルトを追加できないことを意味し、メソッドを適応させる別の回答で提案されているルートに進んでいます転送する前に、 f(a,b) を g(b, a=Long.MinValue) などに変更することもできます。

アダプタ メソッドのクライアントに g(b, None) を呼び出す代わりに、g(b) を呼び出させます。とにかく、基になる f(a,b) に Option を渡していません。

于 2012-11-30T03:36:53.460 に答える
0

スカラ プリミティブを Java ラッパー クラスに変換する方法は、Java プリミティブ ラッパーで静的な valueOf メンバーを使用することです。Option[Double] を java.lang.Double または null に変換する必要があるというこの問題がありました。これは私がしたことです:

val value: Option[Double]
val orNull = value.map(java.lang.Double.valueOf(_)).orNull

java.lang.Long/Double/Integer を受け入れるメソッドを呼び出している場合は、リテラル null を渡すだけで機能します。

于 2017-02-24T12:19:11.973 に答える