加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:49:35 所属栏目:安全 来源:网络整理
导读:使用 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.myPr
使用 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读