为什么方差注释会导致Scala无法推断出这种子类型关系?
在代码中
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的情况,并且没有证据证明是这种情况,除非你的节点是不变的) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |