2009-11-13 6 views
14

スカラ型Nothingは(私が理解するように)タイプ階層の下を表し、記号⊥で示されています。つまり、Nothingは任意のタイプのサブタイプです。 Nothingタイプの要件は、タイプ理論の理論的背景なしに私たちのもののためにexplained well by James Iryです!Nothing型がクラス階層の最下部にある場合、なぜそれに対して考えられるメソッドを呼び出せないのですか?

Nothingがすべてのタイプのサブタイプである場合、どうしてタイプのメソッドをNothingで呼び出せないのですか?明らかに、私はNothingをインスタンス化することはできませんが、なぜ以下のコンパイルはできませんか? Nothingとして確か

var n: Nothing = _ 

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

Stringのサブタイプが、これはOKである必要がありますか?次のコンパイルはちょうど良いことに注意してください!

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

もう1つのことは、 'n.length'では、あなたが話している' length'メソッドをScalaが知る方法がないことです。あなたは、引数がまたは 'this'引数)は正しい型を持ちます。 'foo(n)'ではどちらが既に明らかですか。 – Owen

答えて

15

Nothingはすべてのサブタイプですが、は、Anyのものを除き、を継承しません。これは、Nothingが言語の機能的な終わりに向かっているためです。 OptionListのようなものは必要ですが、タイプのように、クラスとしてではありません。

ここでの区別は、オブジェクト指向の背景から来た人にとってはちょっと変わっていますが、実際にはOOPとは非常に異なる概念であるということです。確かに、オブジェクト指向は何らかの形でサブタイプ化を意味しますが、その逆は真ではありません。 Benjamin Pierceのタイプとプログラミング言語F_<( "F sub"と発音)は、サブタイプ付きの最小限の例として機能しますが(OOではありません)、優れた表現です。

今や、私は、Nothingが通常の継承ルールから免れているという事実は、少し矛盾しているようです。しかし、理論的な観点からは、理にかなっています。

2

私はNothingは(例外をスロー)のいずれかの方法を受け入れ、それらのすべてに標準操作を実行する可能性があるとします。しかしそれはあまり役に立ちません。

コンパイラエラーを提示することによって、コンパイラは、プログラマに、彼が最も望ましくないタイプのコードNothingがコード内のどこかで推測されたことを警告します。
final trait Nothing extends Any
とのtoString Anyのメンバーである:それはdefintionよのため

+0

しかし、私は何もしないで 'toString'を呼び出すことができます。コンパイラの観点からNothingを特別なケースとして扱ういくつかの醜さがあるかどうか疑問に思っていました。あるいは、私の型理論が間違っていて、型がサポートしている型と型自体が必ずしも対応付けされていないのかどうかを確認してください。 –

+0

可能であれば、コンパイル時の検証を行うことを考えました。それは醜いではありません、それは良いですが、ランタイムエラーの代わりにあなたはコンパイル時のものを得る。 –

0

あなたはNothing変数にtoStringを呼び出すことができます。私はscalaコンパイラの治療法Nothingはタイプ境界内にあると思うし、それは他のどのような特性もすべての場合と同様に扱います。 Nothingの型で変数の任意のメソッドを呼び出すことは非常に奇妙に思えます。

+0

しかし、まだいくつかの特別な治療が行われています。 'Nothing'の* signature *型から、他のすべての型に拡張することはできません。 –

+1

ああ、それは特性ではなく、クラスです。したがって、その形質によって明示的に定義されたメソッドだけを呼び出すことができます。それは多くを説明するだろう。 – jqno

+1

@oxbow_lakes:仕様書に記載されているような特別な扱いは、コンパイラがタイプ境界の観点から特に扱うようにします。次のそれぞれの型Tについては真です:Nothing

関連する問題