重载现有的`toInt`方法

StringLike中的toInt方法不带任何参数,只能用十进制进行解析。 所以为了解析二进制,十六进制等,我们需要求助于Java的Integer#parseInt(String s, int radix)

为了弥补这种状况,我尝试了以下内容

implicit def strToToIntable(s: String) = new {
  def toInt(n: Int) = Integer.parseInt(s, n)
}

然而,

"101".toInt(2)

导致REPL编译器“崩溃壮观”并且不能在编译的代码中工作。

使用“丰富我的图书馆”模式重载现有方法是否存在一些限制?


如果没有隐式,运行"101".toInt(2)导致REPL告诉我Int没有参数。 所以我猜想现在发生的事情是它正在运行"101".toInt ,然后试图"101".toInt apply(2) ,这是没有意义的。 我会建议你toInt地重新命名,以避免这个问题。

编辑

我自己取得了一些成功。 我明确定义了一个pimped的字符串类

class StrToRadixInt(s:String) {
  def toInt(radix: Int) = Integer.parseInt(s,radix)
}

implicit def strToToIntable(s:String) = new StrToRadixInt(s)

而且REPL很高兴:

scala> "101".toInt(2)
res4: Int = 5

REPL不应该崩溃 - 这是一个错误。 但即便如此,名字的重载也有些令人沮丧,在某些情况下也不被支持。 只需使用不同的名称:

implicit def parseBase(s: String) = new { def base(b: Int) = Integer.parseInt(s,b) }

scala> "10110" base 2
res1: Int = 22
链接地址: http://www.djcxy.com/p/55843.html

上一篇: Overloading the existing `toInt` method

下一篇: How to write custom serializer and deserializer in Jackson?