问题描述
我正面临与scala隐式分辨率有关的怪异问题
这是代码段
import scala.collection.Factory
import scala.collection.immutable.Seq
sealed trait A
sealed trait B
case class BImpl() extends B
case class AImpl() extends A
object implicitsContainer {
type AB = (A,B)
implicit def toStringAnyTuples[C[X] <: Iterable[X],A <: AB]
(col: C[A])
(implicit factory: Factory[(String,Any),C[(String,Any)]])
: C[(String,Any)] = {
factory.fromSpecific(col.iterator.map(f => f._1.toString -> f._2))
}
}
object Main extends App {
import implicitsContainer._
def a(f: Seq[(String,Any)]): Seq[(String,Any)] = f
val w: Seq[(AImpl,BImpl)] = Seq(AImpl() -> BImpl())
val x: Seq[(String,Any)] = a(w)
// Won't compile
// val y: Seq[(String,Any)] = a(Seq(AImpl() -> BImpl()))
}
Scala自动选择隐式方法
implicit def toStringAnyTuples[C[X] <: Iterable[X],A <: AB](col: C[A])
(implicit factory: Factory[(String,Any)] = {
factory.fromSpecific(col.iterator.map(f => f._1.toString -> f._2))
}
为此:-
val w: Seq[(AImpl,Any)] = a(w)
但是为此抛出错误
val y: Seq[(String,Any)] = a(Seq(AImpl() -> BImpl()))
,错误是:-
Error:(44,47) type mismatch;
found : (AImpl,BImpl)
required: (String,Any)
val y: Seq[(String,Any)] = a(Seq(AImpl() -> BImpl()))
还有一点,如果我从 w
中删除类型 val w = Seq(AImpl() -> BImpl())
val x: Seq[(String,Any)] = a(w)
然后这也可以正常工作。 唯一的错误是与
val y: Seq[(String,Any)] = a(Seq(AImpl() -> BImpl()))
我正在使用:-
SCALA-> 2.13.3
SBT-> 1.3.13
JAVA-> 14
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)