【发布时间】:2014-08-21 16:58:50
【问题描述】:
直到最近遇到奇怪的问题,我一直认为我理解 scala 的隐含。
在我的应用程序中,我有几个域类
case class Foo(baz: String)
case class Bar(baz: String)
以及一个能够从字符串构造域对象的类。它可以被子类化以进行真正的反序列化,这并不重要。
class Reads[A] {
def read(s: String): A = throw new Exception("not implemented")
}
接下来是隐式反序列化器
implicit val fooReads = new Reads[Foo]
implicit val barReads = new Reads[Bar]
以及将字符串转换为域类之一的助手
def convert[A](s: String)(implicit reads: Reads[A]): A = reads.read(s)
不幸的是,在尝试使用它时
def f(s: String): Foo = convert(s)
我得到类似的编译器错误
error: ambiguous implicit values:
both value fooReads of type => Reads[Foo]
and value barReads of type => Reads[Bar]
match expected type Reads[A]
def f(s: String): Foo = convert(s)
^
对我来说,代码似乎简单而正确。 Reads[Foo]和Reads[Bar]是完全不同的类型,有什么歧义?
真正的代码要复杂得多,使用play.api.libs.json,但这个简化版足以重现错误。
【问题讨论】:
标签: scala implicit-conversion ambiguity