gpt4 book ai didi

scala - 隐式转换怪异

转载 作者:行者123 更新时间:2023-12-04 02:09:07 24 4
gpt4 key购买 nike

我试图理解为什么隐式转换在一种情况下有效,而在另一种情况下无效。
下面是一个例子:

   case class Wrapper[T](wrapped: T)
trait Wrapping { implicit def wrapIt[T](x: Option[T]) = x.map(Wrapper(_))

class NotWorking extends Wrapping { def foo: Option[Wrapper[String]] = Some("foo") }

class Working extends Wrapping {
def foo: Option[Wrapper[String]] = {
val why = Some("foo")
why
}
}

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

问题是为什么,当我尝试返回 Option[String] 时直接(上面的 NotWorking),我收到一个错误( found : String("foo") required: Wrapper[String] ),如果我在返回结果之前将结果分配给一个 val 就会消失。

是什么赋予了?

最佳答案

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

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]不是 Invariant[Any] 的子类型.编译器需要设置预期类型 "s"Any以便它可以看到 "s"Any 的一个实例在为时已晚之前。

为了让这段代码和你的代码都能正确运行,我认为编译器需要某种它似乎没有的回溯逻辑,也许有充分的理由。

你的原因 Working代码确实有效,是这种类型推断不跨越多行。类似 val a: Invariant[Any] = {val why = Invariant("s"); why}不编译。

关于scala - 隐式转换怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43981576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com