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

为什么方差注释会导致Scala无法推断出这种子类型关系?

发布时间:2020-12-16 19:14:16 所属栏目:安全 来源:网络整理
导读:在代码中 sealed trait Node[+T] case class I[C]() extends Node[C = C] def test[A,B](n: Node[A = B]) = n match { case i: I[c] = val cId: c = c = identity _ val ab: A = B = cId } Scala给出了c =的错误. c不是A = B.删除Node [T]中的方差注释解决了
在代码中

sealed trait Node[+T]
  case class I[C]() extends Node[C => C]

  def test[A,B](n: Node[A => B]) = n match {
    case i: I[c] =>
      val cId: c => c = identity _
      val ab: A => B = cId
  }

Scala给出了c =>的错误. c不是A => B.删除Node [T]中的方差注释解决了错误.

我很困惑,因为我相信,在存在方差注释的情况下,匹配i:I [c]应该创建规则(c => c)<:< (A => B),这是该行编译所需的全部内容.我错过了什么?

解决方法

免责声明:c在运行时被删除,您的匹配将无法正常工作.你匹配我[_]

如果您的节点是不变的,节点[A]只有节点[B]的子类,只有当A = A时.这种力量

n传递给测试[A,B](n:节点[A => B])实际上是节点[A => B]

如果你的理由失败了,如果你的n匹配模式我[Something]什么东西,A和B必须是Something

如果Node是协变的,由于Function1 [-A,B]的定义,你可以调用

test [A,B](n)其中n是Node [A1 => B1],其中A1>:A和B1<:B(等式1) 因此,如果你的n匹配I [C],则意味着A1 = C且B1 = C. 如果你在等式1中替换C,你将得到C>:A和C<:B(等式2) 因此,以下分配不再有效

f: A => B = C => C

要使左侧可从右侧分配,我们需要C => C为Function1 [-A,B]

这意味着A>:C和B <:C但是从等式2我们知道这不成立(除了C = A和C = B的情况,并且没有证据证明是这种情况,除非你的节点是不变的)

(编辑:李大同)

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

    推荐文章
      热点阅读