2014-02-19 37 views
0

Scala in Depth提供以下方差示例。函數[Any,String]特徵和方差

scala> trait Function[-Arg, +Return] { 
    | def apply(arg: Arg): Return 
    | } 
defined trait Function 

scala> val foo = new Function[Any, String] { 
    | override def apply(arg: Any): String = 
    | "Hello. I received " + arg 
    | } 
foo: Function[Any,String] = [email protected] 

scala> val bar: Function[String, Any] = foo 
bar: Function[String,Any] = [email protected] 

那是什麼,我們可以分配給foobar原因?我有一個粗略的想法,但我想我會問完全。

+0

爲什麼downvotes? –

+0

是的,爲什麼downvotes?的[現實世界共和逆變Scala中的示例] –

+0

可能重複(http://stackoverflow.com/questions/5277526/real-world-examples-of-co-and-contravariance-in-scala) –

回答

3

正是因爲方差註解讓Function[Any, String]的​​亞型。

協方差註釋,+意味着較窄的類型的參數用來產生更窄的構造類型和逆變註釋-,意味着較寬的類型參數產生一個窄的構造類型。

+0

啊,所以'String'(-Arg)接受它自己的類型或超級。而「Any」(+ Return)接受自己的類型或子類型?這種推理對於理解爲什麼上面的'val bar ... = foo'起作用是合理的嗎? –

+0

是的,基本上就是這樣。另一個推論是:在沒有方差註釋的情況下,不管參數之間的關係(如果有),不同的參數類型都會產生*無關的*構造類型。其他有助於推理類型兼容性的事實包括:因爲Scala類型系統是一個完整的格子,所以任何兩種類型都有一個共同的超類型和一個共同的子類型。相反,任何兩種類型不需要承載超類型*或*彼此的子類型關係。 –

+1

這很容易與時間解釋:) http://stackoverflow.com/a/5279656/165009 –

相關問題