代码:
fails
在此示例中,只有compiles1
方法无法编译。错误消息是:
错误:(23,16)A =>中没有可用的隐式视图B. future.map(从)
我很困惑为什么没有发现隐含的观点。基于成功编译的compiles2
和compilesN
方法,似乎 可以从A =>获得隐式视图。乙
这里发生了什么,为什么两个fails
方法有效,但{{1}}没有?
我的背景:我还在学习Scala,所以我很容易就会错过一些非常明显的东西。 :)
我在Scala 2.11.8上。
答案 0 :(得分:6)
编译器尝试在from
的eta扩展到函数之前解决implicits,所以当你这样调用它时,from
的类型参数还没有被推断出来:
future.map(from)
compiles2
显然有效,因为您自己提供类型参数。当你调用future.map(from[C1, C2])
时,编译器知道它需要一个隐式的C1 => C2
,因为那是你所说的。
使用compiles1
,差异会更加微妙,但它源于future.map(from)
和future.map(x => from(x))
实际上是非常不同的事实。前者使用eta扩展,由于上述原因而失败。使用future.map(x => from(x))
时,不会发生eta扩展。相反,你有一个匿名函数,只需调用 from
而不是eta扩展它。因此,编译器可以推断x
的类型,它告诉我们x
是C1
(在这种情况下),它可以找到隐式转换c1ToC2
在解析方法的隐式和最终返回类型from
时,满足Future[C2]
的类型参数。