Scala Implicits编译错误

时间:2016-09-22 13:54:25

标签: scala

我写了这段代码

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,所以应该使用它并且事情应该有效。

那么为什么这不能编译?

1 个答案:

答案 0 :(得分:2)

map是一个采用函数参数的普通方法,而map上的List[Foo]需要Foo中的函数。您已经Bar提供了一项功能 - 具体为Bar => Bar - 但是从Foo隐式转换为Bar并不代表您拥有Bar => Bar中的一项功能{1}}到Foo => Bar(这是方法所需要的)。

如果您希望这项工作正常,您需要提供Foo的功能,然后应用转化(显式或隐式),或者您需要提供隐式转换从Bar => BarFoo => Bar(类似于您尝试从List[Foo]List[Bar]提供的那个,但转换发生在另一个方向,因为{ {1}}在第一个参数中是逆变的,而Function1是协变的。)

(但这是一个非常糟糕的主意。)

相关问题