我想在for-each循环中遍历给定Actor的子节点,如下所示:
for(ActorRef child: this.getContext().children()){
// do things
}
这会产生错误:
HelloWorld.java:78: error: for-each not applicable to expression type
for(ActorRef child: this.getContext().children())
^
required: array or java.lang.Iterable
found: Iterable<ActorRef>
1 error
The docs for UntypedActorContext说children()
方法应该返回&{39; Iterable[ActorRef]
&#39;,但内联超链接用于该特定&#39;的类型定义。 Iterable
&#39;导致Scala Iterable类型的文档而不是Java类型,这些文档不是一回事。
这可以在实践中得到证实:从children()
调用返回的对象未通过&#34; instanceOf Iterable&#34;检查并致电&#34; getClass()
&#34;在它上面返回&#34;类akka.actor.dungeon.ChildrenContainer$ChildrenIterable
&#34;。
我觉得很清楚,这是不 Java Iterable,错误是合适的。但是我如何将其强制或编组为Java Iterable? This link in the Scala docs表明Scala-&gt; Java有转换函数,但我无法对要导入的内容或如何从Java调用它们做出正面或反面的思考;我见过的唯一例子就是Scala。
P.S。我意识到我可以使用while循环和children().iterator()
返回的Scala-Iterator来构造for-each循环的等价物。我真正理解的是如何使用Scala提供的类型转换例程。
答案 0 :(得分:4)
我还没有使用Scala,但是文档说的是
java.lang.Iterable<ActorRef> jChildren = JavaConversions.asJavaIterable (this.getContext().children());
for (ActorRef child: jChildren) {
// do stuff
}
注意:如果在同一个类中使用两种类型的Iterables,则需要在声明中扩展java.lang.Iterable以确保它使用正确的类。
或者你可以在一行中这样做:
for (ActorRef child: JavaConversions.asJavaIterable(this.getContext().children())) {
// do stuff
}
答案 1 :(得分:1)
如果您正在使用Java,那么您将使用UntypedActor及其UntypedActorContext,它提供getChildren()
方法:http://doc.akka.io/japi/akka/2.3.4/akka/actor/UntypedActorContext.html
文档:
java.lang.Iterable<ActorRef> getChildren()
Returns an unmodifiable Java Collection containing the linked actors, please note that the backing map is thread-safe but not immutable