2010-02-13 80 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