首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么创建元组的显式语法只允许AnyRefs作为类型注释?

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

Stack Overflow用户
提问于 2011-07-13 17:22:54
回答 1查看 1.3K关注 0票数 3

此代码适用于:

代码语言:javascript
复制
scala> val x = ""
x: java.lang.String = ""

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

这张没有:

代码语言:javascript
复制
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)
                     ^

就像这个一样:

代码语言:javascript
复制
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是指向预期符合scala.AnyRef (§6.1)的值的路径。

这背后的理由是什么,是否有必要像最近0.getClass那样取消这种限制?

EN

回答 1

Stack Overflow用户

发布于 2011-08-10 09:37:43

正如您在Scala类层次结构 Int上看到的那样,UnitBoolean (和其他类)不是AnyRef的子类,因为它们被转换为java intvoidboolean等等,女巫不是Object的子类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6682979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档