[英]Scala Co and Contravariance
是! 這個問題的另一個,是的,我已經在stackoverflow中閱讀了很多這個問題,但仍然不理解這個概念及其應用。
因此,我是Scala的新手,和很多人一樣,我仍然沒有得到Contravariance的概念,我正在閱讀《 Programming Scala,第二版》,並在第283頁上開始對co和convariance進行解釋。以下示例:
給出層次結構:
class CSuper { def msuper() = println("CSuper") }
class C extends CSuper { def m() = println("C") }
class CSub extends C { def msub() = println("CSub") }
然后有一個函數和一些使用示例:
var f: C => C = (c: C) => new C
f = (c: CSuper) => new CSub
f = (c: CSuper) => new C
f = (c: C) => new CSub
f = (c: CSub) => new CSuper // COMPILATION ERROR!
在Java中思考,我知道最后一個表達式不會編譯,因為CSuper是CSub的超類型。
我不明白什么是類型,在這種情況下,Function1 [-C,+ C]在第一個參數中是變量嗎?
該書說,對於協變性,當where X[String] is a supertype of X[Any], for some type X.
co /協方差僅適用於參數化類型的子類,我的意思是由於我們使用的是Function1,所以方差僅適用於Function1的子類型,對嗎?
它實際上是如何工作的,我什么時候應該使用/需要它?
如果T'是T的子類,那么Container [T']是否被視為Container [T]的子類?
[+T]
協變 :C [T']是C [T]的子類,
[-T]
相反: C [T]是C [T']的子類
Function1
被定義為trait Function1[-T1, +R]
,因此參數是互變量的,結果類型是協變量的。
這意味着,哪些參數是給定函數的參數類型的超類型,而哪個結果類型是給定函數的結果類型的子類型的函數本身就是給定函數的子類型。
在您的示例中,當您為C => C
類型的f
分配不同的函數聲明時,只會編譯有效的子類型。
即,只有這些函數聲明是C => C
有效子類型:
var f: C => C = (c: C) => new C
f = (c: C) => new C
f = (c: C) => new CSub
f = (c: CSuper) => new C
f = (c: CSuper) => new CSub
其他所有內容都是C => C
超類型,並且不能分配給f
或無關類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.