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)
隐含必须以简单名称提供,因此您可以在导入时重命名.
只是为了验证:
scala> import A._ ; import B.{ Imp => BImp, _ }
import A._
import B.{Imp=>BImp, _}
scala> 3.myPrint
3
Run Code Online (Sandbox Code Playgroud)