【发布时间】:2013-05-31 06:38:56
【问题描述】:
我试图更好地理解以下行为:
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, -C, +D] (f1 : BaseFunc[A, B], f2 : BaseFunc[C, D])
extends BaseFunc[A, D]
实际上更可取,但我仍然想更好地了解这里发生了什么。
【问题讨论】:
-
耐人寻味...我花了 1 个小时寻找一个类型安全性因类型绑定而中断的示例。没有找到:(
-
此外,如果有一个示例与类型绑定不符,很难看出在视图绑定中进行替换将如何解决它。
-
是的,我有点同意。但根本区别在于,视图绑定总是根据创建类的类型进行转换,而类型绑定则不一定如此。 (至少我的直觉是这样说的......)
标签: scala generics types type-inference type-bounds