Lui*_*hys 55 scala implicit-conversion
说我正在写一个扩展方法
implicit class EnhancedFoo(foo: Foo) {
def bar() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
你应该总是extends AnyVal在课堂上定义吗?在什么情况下你不想让隐式类成为一个值类?
Ale*_*nov 49
让我们看看为值类列出的限制,并考虑它们何时可能不适合隐式类:
"必须只有一个主构造函数,其中只有一个public,val参数,其类型不是值类." 因此,如果要包装的类本身是一个值类,则不能将其implicit class用作包装器,但是您可以这样做:
// wrapped class
class Meters(val value: Int) extends AnyVal { ... }
// wrapper
class RichMeters(val value: Int) extends AnyVal { ... }
object RichMeters {
implicit def wrap(m: Meter) = new RichMeter(m.value)
}
Run Code Online (Sandbox Code Playgroud)
如果您的包装器也有隐式参数,您可以尝试将它们移动到方法声明中.即代替
implicit class RichFoo[T](foo: Foo[T])(implicit ord: Ordering[T]) {
def bar(otherFoo: Foo[T]) = // something using ord
}
Run Code Online (Sandbox Code Playgroud)
你有
implicit class RichFoo[T](foo: Foo[T]) extends AnyVal {
def bar(otherFoo: Foo[T])(implicit ord: Ordering[T]) = // something using ord
}
Run Code Online (Sandbox Code Playgroud)"可能没有专门的类型参数." 在包装一个本身具有专用类型参数的类时,您可能希望包装器是专用的.
equals或hashCode方法." 不相关,因为隐式类也不应该有equals/hashCode.vars或lazy vals 的合理用法.此外,使隐式类成为值类可能会使用反射更改某些代码行为,但反射通常不应该看到隐式类.
如果你的隐式类确实满足所有这些限制,我想不出一个不使它成为值类的理由.