我正在自学Scala并遇到了这个。继以下优秀答案之后Link,假设我有以下代码:
object Example extends App {
val x = Seq(1, 2, 3)
val y = Seq("1", "2", "3")
class Or[A, B]
implicit def orA[A, B](implicit ev: A): Or[A, B] = new Or
implicit def orB[A, B](implicit ev: B): Or[A, B] = new Or
def f1[T](seq: Seq[T])(implicit ev: Or[T =:= Int, T =:= String]) = {
println(seq)
}
f1(Seq(1, 2, 3))
f1(Seq("1", "2", "3"))
}
这样编译一切都很好。但现在假设我更改了该函数,以便它采用序列列表,而不仅仅是序列,然后尝试以下操作:
object Example extends App {
val x = Seq(1, 2, 3)
val y = Seq("1", "2", "3")
class Or[A, B]
implicit def orA[A, B](implicit ev: A): Or[A, B] = new Or
implicit def orB[A, B](implicit ev: B): Or[A, B] = new Or
def f1[T](seq: List[Seq[T]])(implicit ev: Or[T =:= Int, T =:= String]) = {
println(seq)
}
f1(List(Seq(1, 2, 3), Seq("1", "2", "3")))
}
然而这失败了。错误信息是:
无法找到参数 ev 的隐式值:conusviz.Example.Or[Any =:= Int,Any =:= String]
我的问题是,为什么会发生这种情况?我只是将编译器应该能够推断出另一种类型的东西包装起来。有办法让它发挥作用吗?
我希望该函数采用 Int (或确实 AnyVal)或字符串列表并且仍然可以工作。我只是有点困惑为什么编译器会感到困惑。从学习的角度来看,任何关于编码答案的解释都将受到深深的赞赏。