【问题标题】:Scala finds my implicit conversion twice, causing "ambiguous implicit" errorsScala 两次找到我的隐式转换,导致“模棱两可的隐式”错误
【发布时间】:2015-11-02 22:56:18
【问题描述】:

我正在使用具有PropertyContainer 接口的第三方库。它允许您根据java.lang.Object 获取/设置属性,但它实际上只支持这些东西的java 原语、字符串和数组。所以我试图在属性容器类上做一个轻量级的包装器。

Property.scala

class Property[A <% NeoTypeEvidence[A]](val name: String) {
  def apply(pc: PropertyContainer) = pc.getProperty(name).asInstanceOf[A]
  def update(pc: PropertyContainer, value: A) = pc.setProperty(name, value)
}

package.scala

{
  sealed trait NeoTypeEvidence[A]
  object AnyValTypeEvidence extends NeoTypeEvidence[AnyVal]
  object StringTypeEvidence extends NeoTypeEvidence[String]
  object AnyValArrayTypeEvidence extends NeoTypeEvidence[Array[AnyVal]]
  object StringArrayTypeEvidence extends NeoTypeEvidence[Array[String]]

  implicit def anyValToEvidence(v: AnyVal) = AnyValTypeEvidence
  implicit def stringToEvidence(s: String) = StringTypeEvidence
  implicit def anyValArrayToEvidence(v: Array[AnyVal]) = AnyValArrayTypeEvidence
  implicit def stringArrayToEvidence(s: Array[String]) = StringArrayTypeEvidence
}

测试文件

val name = new Property[String]("name")

假设编译器发现隐式 StringTypeEvidence 满足[String &lt;% NeoTypeEvidence[String]] 的条件,我希望它可以正常工作。我得到的是一个错误:

ambiguous implicit values:  
both method stringToEvidence in package neo of type 
  (s: String) com.dylemma.neo.package.StringTypeEvidence.type  
 and method stringToEvidence in package neo of type 
  (s: String) com.dylemma.neo.package.StringTypeEvidence.type  
match expected type 
String => com.dylemma.neo.package.NeoTypeEvidence[String]

所以 scala 两次找到我的隐式转换?我已经进行了几次清理+重建,但这并没有解决任何问题。为什么会发生这种情况,我该如何解决?

edit/note: 我注意到这似乎只发生在我尝试在定义隐式的同一包中创建Property 时。因此,如果我在some.other.package 中执行完全相同的代码并导入the.main.package._,它就可以毫无怨言地工作。不过我还是不明白为什么。

【问题讨论】:

  • 对我有用,但是您可以将隐式移动到 NeoTypeEvidence 的伴随对象,看看是否有帮助。
  • package.scala 中的东西是否在您忘记提及的包对象中?
  • 是的,特征和隐含在package object neo

标签: scala implicit-conversion implicit


【解决方案1】:

我的猜测是你导入了两次隐式。检查rules for implicit resolution here

很可能(尽管很难用您的示例说明),您在使用显式导入的同时也在处理同一个包,默认情况下隐式已经存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多