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