2010-02-13 112 views
3

我有一個繼承Actor特質的類。在我的代碼中,我有一個方法使用循環創建x這個actor的數字,另一個方法只是發送完成消息給他們所有人,告訴他們終止。我使kill方法只需要一個Actor的數組,因爲我希望能夠將它與任何類型的Actor的數組一起使用。然而,出於某種原因,當我將生產者擴展Actor的Array [Producer]類型的值傳遞給接受類型Array [Actor]的方法時,我得到一個類型錯誤。斯卡拉不應該看到生產者是一種類型的演員,並自動施放它?在斯卡拉自動鑄造

回答

6

您所描述的內容叫做協方差,它是Scala中大部分集合類的屬性 - 子類型的集合是超類型集合的子類型。但是,由於Array是一個Java原始數組,它不是協變的 - 子類型的集合完全不同。 (這種情況在2.7更復雜的地方是幾乎 Java原始陣列;在2.8數組只是一個普通的Java基本類型數組,因爲2.7併發症變成了有不幸的極端情況。)

如果你嘗試與ArrayBuffer同樣的事情(從collection.mutable < - 編輯:這部分是錯誤的,見註釋)或List(< - 編輯:這是真的)或Set(< - 編輯:沒有,Set也是不變的),你」你會得到你想要的行爲。您也可以創建一個Array[Actor]開始,但始終爲其提供Producer值。

如果由於某種原因您確實必須使用Array[Producer],您仍可以使用.asInstanceOf[Array[Actor]]進行投射。但是我建議使用原始數組以外的東西 - 任何你可能用演員做的事情都要比使用更全功能的集合類的開銷要慢得多。

+0

我剛剛改變我的陣列的mutable.ArrayBuffer的,但我仍然得到相同的鑄造問題。順便說一句,我正在使用Scala 2.7.7。 – 2010-02-13 02:06:53

+0

但是,將集合對象切換爲包含Actor而不是我的子類似乎已經解決了問題。 – 2010-02-13 02:08:25

+1

哎呀 - 我忘了很多'mutable'集合是不變的。儘管如此,不可變的.Vector'會起作用。 – 2010-02-13 02:24:30