2011-03-15 67 views
6

如何SEQ [+ A]可以以如果A在逆變位置發生協變:Seq [+ A]如何在A中協變?

def :+ (elem: A) : Seq[A] ?

據我所知,一個方法參數類型是逆變位置。我錯過了什麼?

回答

10

這就是用例簽名。這不是一個真正的簽名,就是你通常在常見用例中看到的。

真正的簽名是:

def :+ [B >: A, That] (elem : B)(implicit bf : CanBuildFrom[Seq[A], B, That]) : That 

哪像你看到的,甚至不保證Seq回報,更A

+5

建立在丹尼爾所說的基礎上,收集方法返回_a新的collection_,並且這些可以有更寬的類型。所以,是的,一個'Seq [A]'只能包含'A's,但是你的新的'Seq'可以擴大它的類型,這樣它就可以包含不僅僅是'A'。 – 2011-03-15 20:20:59

+3

這個用例簽名使用':+(elem:A):Seq [A]'而不是':+ [B>:A](elem:B):Seq [B]''雖然有點遺憾。 – 2011-03-15 20:43:16

+0

@Kris I concur:':+ [B>:A](elem:B):Seq [B]'更直觀。我們可以讓斯卡拉大家改變API文檔嗎? – Michael 2011-03-16 12:29:07

相關問題