Я хотел бы перебирать детей данного Актера в каждом цикле, например:
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
Документы для UntypedActorContext говорят, что метод children()
должен возвращать " Iterable[ActorRef]
", но встроенная гиперссылка для определения типа для этого конкретного " Iterable
" приводит к документам для типа Scala Iterable, а не к Java типа, которые не то же самое.
Это может быть подтверждено на практике: объект, возвращенный из вызова children()
завершает проверку "instanceOf Iterable", а вызов " getClass()
" на нем возвращает "class akka.actor.dungeon.ChildrenContainer$ChildrenIterable
".
Мне кажется довольно ясным, что это не Java Iterable и что ошибка подходит. Но как я могу принудить или переделать его в Java Iterable? Эта ссылка в документах Scala предполагает, что существуют функции преобразования для Scala-> Java, но я не могу делать заголовки или хвосты того, что импортировать или как их называть из Java; единственные примеры, которые я видел, были для Scala.
PS Я понимаю, что я могу, вероятно, использовать while-loop и Iterator Scala-, возвращаемые child children().iterator()
чтобы построить эквивалент для каждого цикла здесь. Я действительно понимаю, как использовать процедуры преобразования типов, которые предоставляет Scala.
Я не использовал 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
}
Если вы используете Java, вы будете использовать UntypedActor и его UntypedActorContext, который предоставляет getChildren()
-method: http://doc.akka.io/japi/akka/2.3.4/akka/actor/UntypedActorContext. HTML
Doc:
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