Scala类型边界和方差
我试图更好地理解以下行为:
scala> class C[-A,+B <: A] <console>:7: error: contravariant type A occurs in covariant position in type >: Nothing <: A of type B class C[-A,+B <: A] ^ 但是以下工作: scala> class C[-A,+B <% A] defined class C 我可以看到边界和有界变量的方差可能存在问题,尽管我不清楚具体问题是什么. 对于一些背景,我定义了类似函数的类,我想做类似的事情 CompositeFunc[-A,+B <: C,-C,+D] (f1 : BaseFunc[A,B],f2 : BaseFunc[C,D]) extends BaseFunc[A,D] 按理说 CompositeFunc[-A,+B <% C,D] 实际上是可取的,但我仍然希望更好地了解这里发生了什么. 解决方法
首先是简单的一个:
class C[-A,+B <% A] 这相当于 class C[-A,+B](implicit view: B => A) 由于视图不是公开返回的,因此它不会限制A或B的方差. class C[-A,+B](val view: B => A) // error: B in contravariant position in view 换句话说,就约束而言,C [-A,B <%A]与C [-A,B]没有区别,视图参数不会改变任何东西. 上限情况C [-A,B<:A]我不确定. §4.5中的Scala语言规范说明
似乎没有涉及B的方差,但通常上限必须是协变的: trait C[-A,B <: A] // contravariant type A occurs in covariant position 这必须以某种方式产生问题?但我无法想出一个例子,证明这种结构在特定情况下变得不健全…… 至于组合功能,为什么不呢 class Composite[-A,B,+C](g: A => B,h: B => C) extends (A => C) { def apply(a: A) = h(g(a)) } 编辑:例如: import collection.LinearSeq def compose[A](g: Traversable[A] => IndexedSeq[A],h: Traversable[A] => LinearSeq[A]) = new Composite(g,h) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |