我有一个继承Actor特征的类。在我的代码中,我有一个方法,使用循环创建这个actor的x
个数字,另一个方法只是将Finish消息发送给所有人,告诉他们终止。我使用kill方法只需要一个Actor数组,因为我希望能够将它与任何类型的Actor数组一起使用。但是,出于某种原因,当我传递Array [Producer]类型的值,其中Producer将Actor扩展到接受类型Array [Actor]的方法时,我得到一个类型错误。 Scala不应该看到Producer是一种Actor并自动转换它吗?
答案 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做的任何事情都会比使用更全功能的集合类的微小开销慢得多。