我想不出任何情况下的类型AnyVal将是有益的,特别是与另外的Numeric类型抽象了Int,Long等有没有实际使用情况AnyVal,或只是一种假象,使类型层次位更漂亮?
只是为了澄清,我知道什么AnyVal 是,我不能想到我会真的需要它在Scala中的任何时间.当我会永远需要一个类型涵盖Int,Character和Double?现在看来似乎只是存在使类型层次漂亮(即它看上去有更好AnyVal和AnyRef兄弟姐妹,而不是Int,Character等直接继承Any).
正如om-nom-nom已经说过的那样,AnyVal是scala中所有原语的常见超类型.然而,在scala 2.10中,将会有一个名为的新功能value classes.值类是可以内联的类,这样可以减少扩展我的库模式的开销,因为不会有包含这些方法的包装类的实例,而是静态调用它们.您可以在SIP-15中阅读有关值类的所有内容.
我们去录像带,呃,规范12.2:
值类是其实例未由底层主机系统表示为对象的类.所有值类都继承自AnyVal类.
所以,也许问题是,如果一切都是一个对象,为什么我不关心某些东西是否被表示,即实现为一个对象?这是实现细节中的实现.
但是,我们不要假装,当然你关心.你从不专攻吗?
规范继续:
Scala实现需要提供值类Unit,Boolean,Double,Float,Long,Int,Char,Short和Byte(但也可以自由提供其他类).
因此,除了所需值类的枚举之外,对AnyVal的测试是有意义的.
也就是说,你必须接受@ drexin的答案,因为如果你没有使用值类进行扩展方法,那么你就不会真正生活.(从某种意义上讲,生活起来.)
SIP的动机:
... Scala中的类可以完全内联,因此与外部方法相比,对这些类的操作没有任何开销.内联类的一些用例是:
- 内联隐式包装器.这些包装器上的方法将被转换为扩展方法.
- 新的数字类,例如无符号整数.这些类不再需要拳击开销.所以这类似于.NET中的值类.
- 代表计量单位的类.同样,这些类不会产生拳击开销.
您可以将扩展方法本身标记为@inline,并且所有内容都是内联的:没有对象包装器,并且您的小方法是内联的.
我每天都使用这个功能.昨天我遇到了一个bug.该错误已经修复.这就是说它是一个很酷的功能,Scala人会从Coursera中抽出时间来消除它中的一个小错误.
这让我想起,我忘了问,这不是Coursera测验问题,是吗?