Конвертировать Akka Iterable в java.lang.Iterable?

1

Я хотел бы перебирать детей данного Актера в каждом цикле, например:

    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.

Теги:
akka

2 ответа

3
Лучший ответ

Я не использовал 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
}
  • 0
    Это прояснилось, спасибо! Я бы поддержал, но у меня еще недостаточно кармы, чтобы сделать это.
  • 0
    @Sayotte, если вы задаете вопрос, то вы принимаете ответ, а не голосование.
1

Если вы используете 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню