6

私自身のコードと多数のメーリング リストへの投稿で、Nothing が他の 2 つの型の最小上限として推論されているために混乱していることに気付きました。

答えはあなたには明白かもしれませんが*、私は怠け者なので、あなたに尋ねます*:

  • このように何も推論しないことが最も望ましい結果となるのは、どのような条件の下ですか?

  • これらの場合にコンパイラにエラーをスローさせたり、何らかの注釈によってオーバーライドされない限り警告をスローさせたりすることは理にかなっていますか?

* 複数

4

2 に答える 2

4

Nothing はすべてのサブタイプではないため、ある意味では、すべてのスーパータイプである Any の対応する部分です。インスタンス化することはできません。Nothing オブジェクトを保持することはできません。Nothing が実際に役立つ状況が 2 つあります (私は認識しています)。

  • (代わりに Unit を使用する有用な値を返さない関数とは対照的に) 決して返らない関数。これは、無限ループ、無限ブロック、常に例外をスローする、またはアプリケーションを終了する場合に発生します。
  • 空のコンテナのタイプを指定する方法として (Nil または None など)。Java では、キャストやその他のトリックなしでは、一般的な不変リストに対して単一の Nil オブジェクトを使用することはできません。日付のリストを作成する場合は、空の要素でさえ正しい型を持つ必要があり、それはのサブタイプでなければなりません。日にち。Date や Integer などは Java で共通のサブタイプを共有しないため、Nil が値を保持していないという事実にもかかわらず、トリックなしではそのような Nil インスタンスを作成することはできません。現在、Scala はすべてのオブジェクトに対してこの共通のサブタイプを持っているため、Nil を として定義でき、object Nil extends List[Nothing]それを使用して任意の List を開始できます。

2 番目の質問に対して: はい、それは役に立ちます。これらの警告をオンにするためのコンパイラ スイッチが既にあると思いますが、よくわかりません。

于 2010-07-21T21:36:41.840 に答える
2

Nothing2 つの型が両方とも でない限り、2 つの型の最小上限として推論することは不可能Nothingです。2 つの型の最小上限を推測し、それらの 2 つの型に共通点がない場合は、次のようになりますAny(ほとんどの場合、またはのような値型が含まれている場合にAnyRefのみ取得するため、取得できます)。.)AnyIntLong

于 2010-07-22T03:43:52.133 に答える