为什么创建元组的显式语法只允许AnyRefs作为类型注释?

时间:2011-07-13 17:22:55

标签: scala types singleton tuples

此代码有效:

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

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

这个没有:

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)
                     ^

以及这一个:

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)
                     ^

语言规范说

  

单例类型的形式为p.type,其中p是指向的路径   期望符合(§6.1)scala.AnyRef。

的值

这背后的理由是什么,如果最近发生在0.getClass的情况下解除限制是否有意义?

1 个答案:

答案 0 :(得分:0)

正如您在Scala class hierarchy Int上看到的那样,UnitBoolean(和其他人)不是AnyRef的子类,因为它们被翻译成java {{1} },intvoid等等,女巫不是boolean的子类。