16

ScalaタイプNothingは、(私が理解しているように)タイプ階層の最下部を表し、記号⊥でも示されます。つまりNothing、任意のタイプのサブタイプです。型の要件は、Nothing型理論の理論的背景がない私たちのために、James Iryによってよく説明されています!

だから私の質問は、Nothingがすべてのタイプのサブタイプである場合、なぜどのタイプのメソッドも呼び出せないのNothingですか?明らかに、私は何もインスタンス化できませんが、なぜ次のコンパイルが行われないのですか?

var n: Nothing = _

def main(args: Array[String]) {
  println(n.length) //compile error: value length is not a member of Nothing
}

確かにNothing、これのサブタイプはString大丈夫ですか?以下は問題なくコンパイルされることに注意してください!

var n: Nothing = _

def foo(s: String) : Int =  s.length

def main(args: Array[String]) {
  println(foo(n))
}

のように:

def main(args: Array[String]) {
  println(n.asInstanceOf[String].length) 
}
4

3 に答える 3

18

whileNothingはすべてのサブタイプですが、 のメソッド以外は継承Anyしません。これはNothing、言語の機能的な目的により適しているためです。Optionやのようなものには必要ですが、クラスとしてではなくtypeListとしてのみ必要です。

ここでの違いは、オブジェクト指向のバックグラウンドを持っている人にとっては少し奇妙ですが、実際のところ、概念としてのサブタイプは OOP とは大きく異なります。確かに、オブジェクト指向は何らかの形でサブタイプ化を意味しますが、その逆は当てはまりません。Benjamin Pierce の「Types and Programming Languages 」は、言語F_< (「F サブ」と発音)をうまく提示しています。これは、サブタイピングを備えた言語の最小限の例として機能します (OO ではありません)。

さて、そうは言っても、Nothingが通常の継承規則の影響を受けないという事実は少し矛盾しているように見えることに同意します。ただし、理論的な観点からは、それは完全に理にかなっています。

于 2009-11-13T14:49:00.107 に答える
2

Nothing任意のメソッドを受け入れ、それらすべてに対して標準操作を実行できると思います(例外をスローします)。しかし、それはあまり役に立たないでしょう。

コンパイル エラーを表示することにより、コンパイラはプログラマに、プログラマが望んでいない可能性が最も高い型 ( Nothing) がコードの特定のポイントで何らかの形で推論されたことを警告しています。

于 2009-11-13T12:28:10.687 に答える
0

toString変数の定義により、Nothing変数を呼び出すことができます。
final trait Nothing extends Any
また、toString は のメンバーですAny。私は、scala コンパイラNothingは型境界内のみを扱い、あらゆるケースで他のトレイトと同じように扱うと思います。タイプの変数で任意のメソッドを呼び出せるようにNothingすることは、非常に奇妙だと思います。

于 2009-11-13T14:02:49.243 に答える