将Akka Iterable转换为java.lang.Iterable?

时间:2014-07-28 02:11:05

标签: java scala akka

我想在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 UntypedActorContextchildren()方法应该返回&{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提供的类型转换例程。

2 个答案:

答案 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