2011-08-14 9 views
8

私は "scalac -explaintypes" を実行し、のようなものが表示される場合:行は何scalac -explaintypes:「<notype><:X?」とは何ですか?平均?

Nothing <: ThingManager? 
    <notype> <: ThingManager? 
    false 
true 

を "> < < NOTYPE:?ThingManagerを"平均?

「タイプがThingManagerに準拠していない可能性がありますか?

+0

この出力をトリガーする小さなスニペットを含めると便利です。 – retronym

答えて

6

-explain-typesすべてのサブタイプチェックを呼び出します。インデントは、再帰呼び出しを表示するために使用されます。再帰の3つのレベルがあります。

scala210 -explaintypes -e '0 : java.lang.String' 
scalacmd9062993631372828655.scala:1: error: type mismatch; 
found : Int(0) 
required: java.lang.String 
0 : java.lang.String 
^ 
one error found 
Int(0) <: java.lang.String? 
    Int <: java.lang.String? 
    <notype> <: java.lang.String? 
    false 
    false 
false 

はここで小さな例です。最初の呼び出しは、UniqueConstantType(0) <:< UniqueTypeRef(String)かどうかをチェックしています。 LHS isは、リテラル整数のシングルトンタイプです。チェックは、そのシングルトンタイプUniqueTypeRef(Int) <:< UniqueTypeRef(String)の基になるタイプconsideringによって続行されます。これはStringに準拠している場合

クラスStringbase type)のIntのスーパータイプのための適合チェック次いでsearchesは、次にチェック。このようなスーパータイプがないため、NoTypeが返されます。 <:<への再帰呼び出しは、出力<notype> <: java.lang.Stringにつながります。

sym2.isClass && { 
    val base = tr1 baseType sym2 // UniqueTypeRef(Int) baseType String => NoType 
    (base ne tr1) && base <:< tr2 
} 

NoTypeはヌルオブジェクトです。 (コンパイラはNoSymbolNoPositionの場合もこのパターンを使用します)。

+0

非常に有益な、ありがとう。 –

関連する問題