scala – 隐性转换奇怪
我想了解为什么一个隐式转换在一种情况下工作,而不是另一种情况.
这是一个例子: 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)时,我得到一个错误(发现:String(“foo”)需要:Wrapper [String]),如果我将结果分配给一个val在返回之前. 是什么赋予了? 解决方法
我不知道这是打算还是被认为是一个错误,但这里是我认为的发生.
在def foo中:选项[Wrapper [String]] = Some(“foo”),编译器会将提供给Some()的参数的预期类型设置为Wrapper [String].然后它看到你提供了一个String,它不是预期的,所以它寻找一个隐式转换String => Wrapper [String],找不到,失败. 为什么需要这个预期的类型的东西,并不只是将Some(“foo”)作为Some [String],然后尝试找到一个转换? case class Invariant[T](t: T) val a: Invariant[Any] = Invariant("s") 为了使此代码工作,编译器不能将Invariant(“s”)键入为Invariant [String],因为因为Invariant [String]不是Invariant [Any]的子类型,因此编译将失败.编译器需要将“s”的预期类型设置为Any,以便在“s”之前可以看到“s”是一个实例,因为太晚了. 为了使这段代码和你的代码正确地运行,我认为编译器需要一些它似乎没有的回溯逻辑,也许是出于好的原因. 您的工作代码工作的原因是,这种类型推断不跨越多行.类似val a:不变[Any] = {val why = Invariant(“s”);为什么}不编译. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |