使用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()
}
这失败了
value myPrint is not a member of Int
如果我给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()
}
而这不是:
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()
}
为什么?这是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._
隐式只是必须以简单名称提供,因此您可以在导入时重命名。
只是为了验证:
scala> import A._ ; import B.{ Imp => BImp, _ }
import A._
import B.{Imp=>BImp, _}
scala> 3.myPrint
3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句