Scala发现我的隐式转换两次,导致“模糊的隐式”错误

时间:2012-03-10 07:41:46

标签: scala implicit-conversion implicit

我正在玩一个有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 <% 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是否发现了两次隐式转换?我做了几次干净+重建,但没有修复任何东西。为什么会发生这种情况?我该如何解决?

编辑/注意:我注意到这种情况似乎只发生在我尝试在同一个包中创建Property时,就像定义了implicits一样。因此,如果我在some.other.package中执行完全相同的代码并且导入the.main.package._,则无需投诉。不过,我仍然不明白为什么。

1 个答案:

答案 0 :(得分:1)

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

最有可能(虽然很难说你的样本),你正在使用显式导入,同时也在同一个包上工作,默认情况下隐式已存在。