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



正如在 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 中的 schtupit Unicode 字符。

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

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

当你调用println(12.toHexString)时,它不是在查看你的包装器,而是在做隐式转换到 RichInt 并使用那里定义的方法。

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

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

我不确定你为什么认为它是编译的。

整数没有whyNot方法。 WrapperwhyNot的方法,但12Int,而不是Wrapper

您需要在Wrapper对象上调用whyNot

new Wrapper(12).whyNot
// => "c"

相关内容

  • 没有找到相关文章

最新更新