Scala中的自动投射

Chr*_*ieb 3 scala

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

Rex*_*err 6

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

如果你尝试同样的事情ArrayBuffer(从collection.mutable< - 编辑:这部分是错误的,请参阅注释)或a List(< - 编辑:这是真的)或a Set(< - 编辑:不,Set也是不变的),你会得到你想要的行为.您也可以创建一个Array[Actor]开始但始终为其提供Producer值.

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