正如在 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
方法。 Wrapper
有whyNot
的方法,但12
是Int
,而不是Wrapper
。
您需要在Wrapper
对象上调用whyNot
:
new Wrapper(12).whyNot
// => "c"