值类型的一些限制

在2.10之前 AnyVal还是 sealed 的,除了系统原生的几个Int,Long等继承自AnyVal,外部类无法extends一个AnyVal

但在2.10中,支持了值类型(value-classes),它的实现是需要class继承于AnyVal的(编译器会特殊对待),所以把AnyVal的sealed修饰去掉了。

用户自定义的值类型,主要是出于性能方面的考虑,避免了运行时的分配对象,用静态方法调用替代了虚方法调用。

因为编译器特殊对待,所以值类型也有一些限制,

1) 最显著的是构造时,必须有且只有一个public val参数
2) 不能有 specialized type parameters。//值类型可以看做与primitive类型相似,当然就不可以再specialize了
3) 不能嵌套本地 trait, class, object 
4) 不能定义equals和hashCode方法
5) 必须是一个顶级类,或在object中的成员(可被静态访问)
6) 不能有val,var,lazy val成员,只能有def
7) 不能继承其它类

这里有值类型的一些细节:
http://docs.scala-lang.org/overviews/core/value-classes.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注