加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 隐性转换奇怪

发布时间:2020-12-16 19:05:14 所属栏目:安全 来源:网络整理
导读:我想了解为什么一个隐式转换在一种情况下工作,而不是另一种情况. 这是一个例子: 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[Wra
我想了解为什么一个隐式转换在一种情况下工作,而不是另一种情况.
这是一个例子:

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],然后尝试找到一个转换?
因为scalac希望能够键入以下代码:

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”);为什么}不编译.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读