【发布时间】:2019-08-06 22:45:52
【问题描述】:
我有一个自定义的compare 方法,它接受两个参数。其中一个应该可以隐式转换为另一个:
object Test extends App {
def compare[T1, T2](a: T1, b: T2)(implicit ev: T1 => T2) = compareImpl[T2](ev(a), b)
def compare[T1, T2](a: T1, b: T2)(implicit ev: T2 => T1) = compareImpl[T1](a, ev(b))
def compareImpl[T](a: T, b: T) = a == b
case class Foo(s: String)
case class Bar(s: String)
implicit def foo2bar(f: Foo): Bar = Bar(f.s)
println(compare(Foo("hello"), Bar("hello")))
}
但是这个 sn-p 给了我错误:
error: ambiguous reference to overloaded definition,
both method compare in object Test of type [T1, T2](a: T1, b: T2)(implicit ev: T2 => T1)Boolean
and method compare in object Test of type [T1, T2](a: T1, b: T2)(implicit ev: T1 => T2)Boolean
match argument types (Test.Foo,Test.Bar) and expected result type Any
implicit def foo2bar(f: Foo): Bar = Bar(f.s)
如果我删除第二个compare,它可以工作,但如果我删除compare(Bar("hello), Foo("hello")),它将无法编译。
我怎样才能让这两个版本没有歧义?
【问题讨论】:
-
问题是,在类型擦除之后,两种方法是完全一样的。顺便说一句,即使没有擦除,呼叫站点也可能是模棱两可的,如果我
compare(1, "1")并且同时存在Int => String和String => Int。恕我直言,太多的魔法在这里是有问题的。
标签: scala implicit scala-macros