Scala中的自动投射

时间:2010-02-13 01:40:58

标签: scala

我有一个继承Actor特征的类。在我的代码中,我有一个方法,使用循环创建这个actor的x个数字,另一个方法只是将Finish消息发送给所有人,告诉他们终止。我使用kill方法只需要一个Actor数组,因为我希望能够将它与任何类型的Actor数组一起使用。但是,出于某种原因,当我传递Array [Producer]类型的值,其中Producer将Actor扩展到接受类型Array [Actor]的方法时,我得到一个类型错误。 Scala不应该看到Producer是一种Actor并自动转换它吗?

1 个答案:

答案 0 :(得分:6)

您所描述的内容称为协方差,它是Scala中大多数集合类的属性 - 子类型的集合是超类型集合的子类型。但是,由于Array是Java原始数组,因此它不是协变的 - 子类型的集合就是不同的。 (情况在2.7中更复杂,它几乎是一个Java原始数组;在2.8中,Array只是一个普通的Java原始数组,因为2.7并发症的结果是不幸的角落情况。)

如果您使用ArrayBuffer(来自collection.mutable< - 编辑:此部分错误,请参阅评论)或List(< - 编辑:这是真的)或Set(< - edit:no,Set也是不变的),你会得到你想要的行为。您也可以创建一个Array[Actor]来开始,但总是提供Producer值。

如果由于某种原因你真的必须使用Array[Producer],你仍然可以使用.asInstanceOf[Array[Actor]]投射它。但我建议使用除原始数组之外的其他东西 - 你可以用actor做的任何事情都会比使用更全功能的集合类的微小开销慢得多。