2015-11-08 56 views
0

我無法理解逆變WRT函數類型1功能TYPE1的定義如下:無法理解逆變WRT功能1(-T1,+ T1)

功能1(-T,+ T)

定義清楚說輸入類型參數是反變換。所以應該允許類型的超類型作爲參數。但爲什麼這給編譯器錯誤。

我在下面

class Animal 
    class Mammal extends Animal 
    class Cow extends Mammal 

我已經定義方法如下

def move(m:Mammal) = Unit c 

當我調用像它下面沒有給出錯誤

move (new Cow) 

但這一舉動類中定義給出錯誤

move(new Animal) 

爲什麼我不能使用Animal作爲參數調用move(),即使Function1是逆變[-T]。

我是新來的Scala,所以請幫我在這

+1

可能重複的[是不是參數類型co-不是contra-variant?](http://stackoverflow.com/questions/13321921/isnt-the-argument-type-co-not-contra-variant) – 757071

回答

0

其實,可以直觀地理解的性質:你不能將動物的情況下移動,因爲功能舉動可能依靠一些方法,它是在哺乳動物中定義但在動物中缺失。

希望這有助於

1

逆變並不意味着功能可以提供「低」類型的值,但比較兩個功能

type F = Function1(A, B) 
type G = Function1(C, B) 

那麼當類型如果A是a superC的類型然後Fsub類型的G。實質上,函數類型的排序(方差)違背(相反)輸入位置類型的排序。

特別是如果你想像的功能:從foo身體的角度

def foo(f : Cow => String) : String = f(new Cow) 

然後,f可以接受Cow,但隨後,從調用者的角度foo,一個函數,接受Animal也將接受Cow就好了,所以是有意義的允許:

foo((a : Animal) => "generic animal noise") 
foo((c : Cow) => "moo") 

在英語中,合同的功能foo是:

給我一件事,當我提供它Cow,我得到還給一個String,作爲回報,我會給你一個String

,特別是,一個函數,當給予Animal提供String,符合該法案對「的事情給定一個Cow時,返回String」。

相關問題