为什么这个几乎相同的价值类不起作用?

Ben*_*itz 0 scala value-class

正如http://docs.scala-lang.org/overviews/core/value-classes.html所承诺的那样,这有效:

class Wrapper(val self: Int) extends AnyVal {
  def toHexString: String = java.lang.Integer.toHexString(self)
}
println(12.toHexString)
Run Code Online (Sandbox Code Playgroud)

但这不编译:

class Wrapper(val self: Int) extends AnyVal {
  def whyNot:      String = java.lang.Integer.toHexString(self)
}
println(12.whyNot)
Run Code Online (Sandbox Code Playgroud)

为什么不?我唯一改变的是方法的名称!

这是错误消息:

error: value whyNot is not a member of Int
    println(12.whyNot)
               ^
Run Code Online (Sandbox Code Playgroud)

是的,我已经仔细检查了里面的schtupit Unicode字符whyNot.

dhg*_*dhg 5

Predef.scala 定义了从Int到RichInt的隐式转换:

  @inline implicit def intWrapper(x: Int)         = new runtime.RichInt(x)
Run Code Online (Sandbox Code Playgroud)

当你调用println(12.toHexString)它不是在看你的Wrapper时,它正在进行RichInt的隐式转换并使用那里定义的方法.

如果您想要自己的隐式转换,则需要使用implicit关键字定义它:

implicit class Wrapper(val self: Int) extends AnyVal {
  def whyNot:      String = java.lang.Integer.toHexString(self)
}
println(12.whyNot)  // prints "c"
Run Code Online (Sandbox Code Playgroud)