我写了这段代码
case class Foo(x: Int)
case class Bar(y: Int)
object Foo {
implicit def toBar(f: Foo) : Bar = { Bar(f.x) }
implicit def toBarList(fl: List[Foo]) : List[Bar] = {fl.map{x: Bar => x}}
toBarList函数不编译。
<console>:17: error: type mismatch;
found : Bar => Bar
required: Foo => ?
implicit def toBarList(fl : List[Foo]) : List[Bar] = { fl.map{x : Bar => x}}
然而,不应该在这里引入隐含的系统?这意味着编译器应该检测到函数需要Bar的错误但是我传递的是Foo。现在已经有一个隐式函数在范围内将Foo转换为一个Bar,所以应该使用它并且事情应该有效。
那么为什么这不能编译?
答案 0 :(得分:2)
map
是一个采用函数参数的普通方法,而map
上的List[Foo]
需要Foo
中的函数。您已经Bar
提供了一项功能 - 具体为Bar => Bar
- 但是从Foo
隐式转换为Bar
并不代表您拥有Bar => Bar
中的一项功能{1}}到Foo => Bar
(这是方法所需要的)。
如果您希望这项工作正常,您需要提供Foo
的功能,然后应用转化(显式或隐式),或者您需要提供隐式转换从Bar => Bar
到Foo => Bar
(类似于您尝试从List[Foo]
到List[Bar]
提供的那个,但转换发生在另一个方向,因为{ {1}}在第一个参数中是逆变的,而Function1
是协变的。)
(但这是一个非常糟糕的主意。)