2011-07-13 8 views
3

このコードは動作します:タプルを作成するための明示的な構文でAnyRefを型名としてのみ許可するのはなぜですか?

scala> val x = "" 
x: java.lang.String = "" 

scala> Tuple2[x.type, x.type](x,x) 
res5: (x.type, x.type) = ("","") 

この1にはない:

scala> val y = 0 
y: Int = 0 

scala> Tuple2[y.type, y.type](y,y) 
<console>:9: error: type mismatch; 
found : y.type (with underlying type Int) 
required: AnyRef 
Note: an implicit exists from scala.Int => java.lang.Integer, but 
methods inherited from Object are rendered ambiguous. This is to avoid 
a blanket implicit which would convert any scala.Int to any AnyRef. 
You may wish to use a type ascription: `x: java.lang.Integer`. 
       Tuple2[y.type, y.type](y,y) 
        ^

と同様に、この1:

scala> val z =() 
z: Unit =() 

scala> Tuple2[z.type, z.type](z,z) 
<console>:9: error: type mismatch; 
found : z.type (with underlying type Unit) 
required: AnyRef 
Note: Unit is not implicitly converted to AnyRef. You can safely 
pattern match `x: AnyRef` or cast `x.asInstanceOf[AnyRef]` to do so. 
       Tuple2[z.type, z.type](z,z) 
        ^

言語仕様が

A語りますシングルトンタイプはfoのものですrm p.type。ここで、pは、 を指すパスであり、scala.AnyRefに準拠することが期待される値です(6.1)。

その背後にある理論的根拠は何ですか。そして最近、0.getClassのようにその制限を解除するのは意味がありますか?

+0

例で示すように、タプルとはまったく関係ありません。ポイントは、値型で.typeを実行できないということです。それが実現可能かどうかは分かりませんし、いつ役に立つのかも知りません。 –

+0

私が引用したもの(§6.1)はそれほどではなく、その背景に何が根本的なのか疑問に思っていますか? – soc

+0

本当にあなたの質問は終了します。ただし、タイトル(とあなたの例)はタプルについて言及しています。 –

答えて

0

あなたがScala class hierarchyIntUnitBoolean(その他)上で見ることができるように、彼らは、Java intvoidに翻訳されているので、AnyRefのサブクラスではありません、booleanなど、魔女はObjectのサブクラスではありません。

+0

しかし、なぜこの制限が存在しますか? – soc

関連する問題