对于Scala中的隐式转换,我可以使用隐式转换函数
implicit def intToX(i:Int):X = new X(i)
1.myMethod // -1
或隐式类
implicit class X(i: Int) {
def myMethod = - i
}
1.myMethod // -1
这两者有什么区别吗?我什么时候应该更喜欢一个?
有关于implicit conversion vs. type class的相关问题,但它仅比较隐式函数和类型类。我感兴趣的是与隐式类的区别。
答案 0 :(得分:19)
隐式类是隐式方法和类的语法糖:
http://docs.scala-lang.org/sips/completed/implicit-classes.html:
scala 2.10 中添加了例如,表格的定义:
implicit class RichInt(n: Int) extends Ordered[Int] { def min(m: Int): Int = if (n <= m) n else m ... }
将由编译器转换如下:
class RichInt(n: Int) extends Ordered[Int] { def min(m: Int): Int = if (n <= m) n else m ... } implicit final def RichInt(n: Int): RichInt = new RichInt(n)
隐式类,因为使用定义隐式方法定义新类非常常见转换为它。
但是,如果您不需要定义新类但定义到现有类的隐式转换,则最好使用隐式方法
答案 1 :(得分:3)
你问了一个问题已经有一段时间了,而且事情似乎发生了变化。实际上,您现在应该总是选择隐式类而非隐式转换。
scala将隐式转换标记为高级语言功能,编译器不鼓励使用它们(至少在Scala push!(out,[t,node,size]);
中)。并且您需要在编译选项中添加一个额外的标志(2.12
)以将其关闭。 See scala-lang docs
此外,Scala社区(或至少LightBend / Typesafe人)甚至计划一般地摆脱非确切的转换。这在2017年11月的会议演讲中提到了Scala 2.13,你可以找到它here。