隐含的转换怪异

时间:2017-05-15 14:05:14

标签: scala implicit-conversion

我试图理解为什么一个隐式转换在一个案例中起作用,但在另一个案例中却没有。 这是一个例子:

Option[T]

基本上,我有一个从Option[Wrapper[T]]Option[String]的隐式转换,并且我正在尝试定义一个函数,该函数返回一个隐式包装的可选字符串。

问题是,当我尝试直接返回NotWorking(上面found : String("foo") required: Wrapper[String])时,我收到错误(stop words),如果我将结果分配给val返回之前。

是什么给出了?

1 个答案:

答案 0 :(得分:10)

我不知道这是故意的还是会被视为错误,但我认为这是正在发生的事情。

def foo: Option[Wrapper[String]] = Some("foo")中,编译器会将提供给Some( )的参数的预期类型设置为Wrapper[String]。然后,它会看到您提供的String不符合预期,因此它会查找隐式转化String => Wrapper[String],无法找到,但会失败。

为什么它需要预期类型的​​内容,并且不只是将Some("foo")键入为Some[String]之后尝试查找转换? 因为scalac希望能够检查以下代码:

case class Invariant[T](t: T)
val a: Invariant[Any] = Invariant("s")

为了使此代码有效,编译器不能只将Invariant("s")键入为Invariant[String],因为编译将失败,因为Invariant[String]不是{{1}的子类型}}。编译器需要将Invariant[Any]的预期类型设置为"s",以便它可以看到Any"s"的实例,但为时已晚。< / p>

为了使这段代码和你的代码能够正确运行,我认为编译器需要一些它似乎没有的回溯逻辑,或许有充分的理由。

您的Any代码确实有效的原因是这种类型推断不会跨越多行。类似地,Working 编译。