我正在玩一个有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._
,则无需投诉。不过,我仍然不明白为什么。
答案 0 :(得分:1)
我的猜测是你导入隐式两次。查看rules for implicit resolution here。
最有可能(虽然很难说你的样本),你正在使用显式导入,同时也在同一个包上工作,默认情况下隐式已存在。