Scala:具有相同名称的多个隐式转换

Hei*_*nzi 5 scala implicit-conversion scala-2.10

使用scala 2.10.3,我的目标是做以下工作:

object A {
  implicit class Imp(i: Int) {
    def myPrint() {
      println(i)
    }
  }
}

object B {
  implicit class Imp(i: String) {
    def myPrint() {
      println(i)
    }
  }
}

import A._
import B._

object MyApp extends App {
  3.myPrint()
}
Run Code Online (Sandbox Code Playgroud)

这失败了

value myPrint is not a member of Int
Run Code Online (Sandbox Code Playgroud)

如果我给A.Imp和B.Imp赋予不同的名称(例如A.Imp1和B.Imp2),它就可以了.

更深入地潜入它,隐式转换似乎存在同样的问题.

这有效:

object A {
  implicit def Imp(i: Int) = new {
    def myPrint() {
      println(i)
    }
  }

  implicit def Imp(i: String) = new {
    def myPrint() {
      println(i)
    }
  }
}

import A._

object MyApp extends App {
  3.myPrint()
}
Run Code Online (Sandbox Code Playgroud)

然而,这不是:

object A {
  implicit def Imp(i: Int) = new {
    def myPrint() {
      println(i)
    }
  }
}

object B {
  implicit def Imp(i: String) = new {
    def myPrint() {
      println(i)
    }
  }
}

import A._
import B._

object MyApp extends App {
  3.myPrint()
}
Run Code Online (Sandbox Code Playgroud)

为什么?这是scala编译器中的错误吗?我需要这种情况,因为我的对象A和B派生自相同的特征(带有类型参数),然后定义其类型参数的隐式转换.在这个特性中,我只能为隐式转换指定一个名称.我希望能够将更多这些对象导入我的范围.有没有办法做到这一点?

编辑:我不能给隐式类赋予不同的名称,因为上面的例子只是解决问题.我的实际代码看起来更像

trait P[T] {
  implicit class Imp(i: T) {
    def myPrint() {
      ...
    }
  }
}

object A extends P[Int]
object B extends P[String]

import A._
import B._
Run Code Online (Sandbox Code Playgroud)

som*_*ytt 8

隐含必须以简单名称提供,因此您可以在导入时重命名.

只是为了验证:

scala> import A._ ; import B.{ Imp => BImp, _ }
import A._
import B.{Imp=>BImp, _}

scala> 3.myPrint
3
Run Code Online (Sandbox Code Playgroud)