我试图理解为什么一个隐式转换在一个案例中起作用,但在另一个案例中却没有。 这是一个例子:
Option[T]
基本上,我有一个从Option[Wrapper[T]]
到Option[String]
的隐式转换,并且我正在尝试定义一个函数,该函数返回一个隐式包装的可选字符串。
问题是,当我尝试直接返回NotWorking
(上面found : String("foo") required: Wrapper[String]
)时,我收到错误(stop words
),如果我将结果分配给val返回之前。
是什么给出了?
答案 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
不编译。