为什么隐式def需要导入implicitConversions而隐式val不能?

时间:2017-06-27 04:44:13

标签: scala

我正在阅读此tutorial,并在底部说明

  

因为如果不加选择地使用隐式转换可能会有陷阱,编译器会在编译隐式转换定义时发出警告。要关闭警告,请执行以下任一操作:将scala.language.implicitConversions导入隐式转换定义的范围...

如果使用隐式val而不是隐式def,则不会抛出警告。那是为什么?

换句话说,如果我执行以下操作,我就不需要导入:

implicit val int2str = (i: Int) => i.toString

但如果我执行以下操作,我确实需要导入:

implicit def int2str(i: Int) = i.toString

- - - - - - - - 更新 这是一个玩具示例,表明隐式val有效:

case class CoolString(coolString: String)

class RichCoolString(rich: CoolString) {
  val hasCat: Boolean = rich.coolString.contains("cat")
}

object RichCoolString {
  implicit val coolStringToRichCoolString = (coolString: CoolString) => new 
RichCoolString(coolString)
}

scala> import RichCoolString._
import RichCoolString._

scala> CoolString("cool cats").hasCat
res0: Boolean = true

1 个答案:

答案 0 :(得分:3)

很可能这是一个错误,两个案例都应该有警告。至少我在规范中找不到异常。创建了https://github.com/scala/bug/issues/10392

相关问题