Scala 2.10 引入了值类,您可以通过使类扩展来指定它们AnyVal
。值类有很多限制,但它们的巨大优势之一是它们允许扩展方法而不会产生创建新类的惩罚:除非需要装箱,例如将值类放入数组中,否则它只是旧类加上一组将类作为第一个参数的方法。因此,
implicit class Foo(val i: Int) extends AnyVal {
def +*(j: Int) = i + j*j
}
展开到不会比自己编写更昂贵的i + j*j
东西(一旦 JVM 内联方法调用)。
不幸的是,SIP-15中描述值类的限制之一是
- C 的基础类型可能不是值类。
如果你有一个值类,你可以得到你的手,比如说,作为一种提供类型安全单元的方法,而不需要装箱的开销(除非你真的需要它):
class Meter(val meters: Double) extends AnyVal {
def centimeters = meters*100.0 // No longer type-safe
def +(m: Meter) = new Meter(meters+m.meters) // Only works with Meter!
}
那么有没有办法在Meter
没有对象创建开销的情况下丰富呢?SIP-15 中的限制阻止了明显的
implicit class RichMeter(m: Meter) extends AnyVal { ... }
方法。