0

正如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)

但这不会编译:

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

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

这是错误消息:

error: value whyNot is not a member of Int
    println(12.whyNot)
               ^

是的,我已经仔细检查了whyNot.

4

2 回答 2

5

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

  @inline implicit def intWrapper(x: Int)         = new runtime.RichInt(x)

当您调用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"
于 2015-01-25T05:18:31.073 回答
0

我不确定你为什么认为它会编译

整数没有whyNot方法。Wrappers 有一个whyNot方法,但12它是一个Int,而不是一个Wrapper

您需要调用whyNot一个Wrapper对象:

new Wrapper(12).whyNot
// => "c"
于 2015-01-25T04:59:19.687 回答