Java阿卡。如何将演员行为与许多泛型相匹配
Java Akka. How to match actor behavior to the many generics
我是 akka 的初学者,在学习期间我有下一个问题:
例如,我有主要演员向其他两个儿童演员发送消息。
他们都将 return 不同的列表。
ChildActorA return Optional<List<Entity1>>
ChildActorB return Optional<List<Entity2>>
如何匹配主角来处理这些响应?
部分演示代码:
public class MainActor extends AbstractLoggingActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Entity1.class, this::onEntity1)
.match(Entity2.class, this::onEntity2)
//How match to the list of these entities?
.match(Optional<List<Entity1>>, this::onList1)
.match(Optional<List<Entity2>>, this::onList2)
.build();
}
}
private void onEntity1(Entity1 entity1) {
final ActorRef entity1ChildActor = getContext().actorOf(Entity1ChildActor.props());
entity1ChildActor.tell("printIt", getSelf());
}
private void onEntity2(Entity2 entity2) {
final ActorRef entity21ChildActor = getContext().actorOf(Entity2ChildActor.props());
entity2ChildActor.tell("printIt", getSelf());
}
其中一位童星:
public class Entity1ChildActor extends AbstractLoggingActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, this::onPrint)
.build();
}
private void onPrint(Entity1 entity1) {
System.out.println(entity1);
//Here I want to tell to parent List of something
//namely Optional<List<Entity1>>
//How can I match parent behavior?
getSender().tell(someOptionalList, getSelf());
}
public static Props props(){
return Props.create(Entity1ChildActor.class);
}
}
泛型类型参数是一个编译时问题。它们在运行时丢失。它被称为type erasure。
所以在运行时 Optional<List<Entity1>>
和 Optional<List<Entity2>>
都变得简单 Optional
并且无法按类型区分。
但是,您可以创建 2 个具体的 classes 用作消息并封装可选列表并与之匹配。或者,您可以创建 1 个具体 class 并让它在字段中保存实体类型并公开它,以便您可以在 match 方法的谓词中使用它。
我是 akka 的初学者,在学习期间我有下一个问题:
例如,我有主要演员向其他两个儿童演员发送消息。 他们都将 return 不同的列表。
ChildActorA return Optional<List<Entity1>>
ChildActorB return Optional<List<Entity2>>
如何匹配主角来处理这些响应?
部分演示代码:
public class MainActor extends AbstractLoggingActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(Entity1.class, this::onEntity1)
.match(Entity2.class, this::onEntity2)
//How match to the list of these entities?
.match(Optional<List<Entity1>>, this::onList1)
.match(Optional<List<Entity2>>, this::onList2)
.build();
}
}
private void onEntity1(Entity1 entity1) {
final ActorRef entity1ChildActor = getContext().actorOf(Entity1ChildActor.props());
entity1ChildActor.tell("printIt", getSelf());
}
private void onEntity2(Entity2 entity2) {
final ActorRef entity21ChildActor = getContext().actorOf(Entity2ChildActor.props());
entity2ChildActor.tell("printIt", getSelf());
}
其中一位童星:
public class Entity1ChildActor extends AbstractLoggingActor {
@Override
public Receive createReceive() {
return receiveBuilder()
.match(String.class, this::onPrint)
.build();
}
private void onPrint(Entity1 entity1) {
System.out.println(entity1);
//Here I want to tell to parent List of something
//namely Optional<List<Entity1>>
//How can I match parent behavior?
getSender().tell(someOptionalList, getSelf());
}
public static Props props(){
return Props.create(Entity1ChildActor.class);
}
}
泛型类型参数是一个编译时问题。它们在运行时丢失。它被称为type erasure。
所以在运行时 Optional<List<Entity1>>
和 Optional<List<Entity2>>
都变得简单 Optional
并且无法按类型区分。
但是,您可以创建 2 个具体的 classes 用作消息并封装可选列表并与之匹配。或者,您可以创建 1 个具体 class 并让它在字段中保存实体类型并公开它,以便您可以在 match 方法的谓词中使用它。