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

时间:2015-01-25 04:33:42

标签: 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)

但是这不能编译:

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字符。

2 个答案:

答案 0 :(得分:5)

Predef.scala defines从Int到RichInt的隐式转换:

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

当您致电println(12.toHexString)时,它没有查看您的Wrapper,它会隐式转换为RichInt并使用方法defined there

如果您想要自己的隐式转换,则需要使用implicit keyword

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

答案 1 :(得分:0)

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

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

您需要在whyNot对象上调用Wrapper

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