【发布时间】:2015-01-17 08:27:48
【问题描述】:
在我的 Akka 程序中,我有一个匿名的内部 Actor(额外模式),它在内部等待来自存储 Actor 的响应,这些 Actor 返回各自域对象的列表(即List[MyDomain])。
匿名actor的接收块像这样等待响应:
def receive = {
case a: List[MyDomain1] => originalSender ! a
case b: List[MyDomain2] => originalSender ! b
}
问题是我收到了删除警告:
Actors.scala:46: non-variable type argument domain.MyDomain1 in type pattern List[domain.MyDomain1] is unchecked since it is eliminated by erasure
(以及上面第二个 case 语句的另一个警告)。
如何在不引入其他类型来表示存储参与者的响应的情况下解决此问题?他们返回一个他们的域列表是有道理的。
【问题讨论】:
-
如果您只需要将响应返回给原始发件人,那么您可以匹配
List [_],或者使用tell的两个参数形式,以便响应直接到达那里。如果您需要对不同类型的列表执行不同的操作,则需要在消息中包含更多类型信息,可能通过将不同的列表包装在不同的 1 元素案例类中。 -
如果类型的数量有限且很小,那么您可以考虑为每种类型创建一个包装案例类,这样您就可以避免与擦除相关的问题。类似
case class MyDomain1List(list:List[MyDomain1])。 -
如果他们返回“他们的域列表”是有意义的,那么他们用一个包含他们的域列表的消息对象进行响应是否也没有意义对象?
-
我想我可以争论一个“容器类型”,例如
ListOfXXX是有道理的;这只是另一个案例类,但我希望它使用列表 :( 选项在这里有帮助吗?
标签: scala pattern-matching akka