我想更好地了解以下行为:斯卡拉类型限制和方差
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
我可以看到,有可能是从问题边界变量和有界变量是相反的,尽管我不清楚具体问题是什么。 我更不清楚为什么改变绑定到视图边界的类型使事情好起来。在没有适用的隐式转换的情况下,我认为这两个定义在很大程度上具有相同的效果。如果有什么,我会期待一个观点必然会提供更多的恶作剧机会。
对于位I定义是在像函数的一些方法类的背景,我想这样做
CompositeFunc[-A, +B <: C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
按理说
CompositeFunc[-A, +B <% C, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
实际上是可取的,但我仍然会喜欢更好地理解这里发生了什么。
耐人寻味的......我花了100小时去找一个例子类型与类型绑定的安全性中断。没有发现:( – gzm0
)另外,如果有一个例子对于绑定的类型是不合适的,很难看出如何在视图边界中进行替换来修复它。 –
是的,我有点同意,但根本的区别在于视图边界总是根据类创建的类型进行转换,而这对于类型绑定来说并不一定是这种情况(说我的直觉至少......) – gzm0