【发布时间】: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 <% 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