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

Heinzi

使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有相同名称的多个参数

来自分类Dev

具有相同名称的多个div

来自分类Dev

具有相同名称的多个输入

来自分类Dev

具有隐式转换的Scala映射

来自分类Dev

如何隐式转换为具有同名方法的类

来自分类Dev

具有多个具有相同名称的字段的 POST

来自分类Dev

使用XSLT显示具有相同名称的多个属性

来自分类Dev

在MVC中处理具有相同名称的多个动作

来自分类Dev

具有相同名称,域和路径的多个Cookie?

来自分类Dev

在Eclipse中导入具有相同名称的多个项目

来自分类Dev

XSD具有相同名称但类型不同的多个元素

来自分类Dev

Spring中具有相同名称的多个字段

来自分类Dev

JSON返回具有相同名称的多个值

来自分类Dev

jQuery填充具有相同名称的多个选择框

来自分类Dev

解析具有相同名称的多个标头

来自分类Dev

保存具有相同名称的多个文件

来自分类Dev

在Linux中创建多个具有相同名称的文件

来自分类Dev

具有相同名称的多个广播组的HTML

来自分类Dev

如何合并多个具有相同名称的列的表

来自分类Dev

解析具有相同名称的多个标头

来自分类Dev

xslt合并具有相同名称的多个节点

来自分类Dev

提交具有相同名称的多个输入的表单

来自分类Dev

XSD具有相同名称但类型不同的多个元素

来自分类Dev

具有相同名称的多个吊索配置

来自分类Dev

Spring中具有相同名称的多个字段

来自分类Dev

在Linux中创建具有相同名称的多个文件

来自分类Dev

获取具有相同名称JAXB的多个XML元素

来自分类Dev

具有相同名称的多个WiFi网络

来自分类Dev

发布具有相同名称的多个字段