当前位置: 首页 > 知识库问答 >
问题:

Java阿卡。如何将演员行为与许多泛型相匹配

云育
2023-03-14

我是阿克卡的乞丐,在我接受教育期间,我有一个问题:

例如,我有一个主参与者,它向其他两个子参与者发送消息。它们都将返回不同的列表。

    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);
    }
}

共有1个答案

景元徽
2023-03-14

泛型类型参数是编译时关注的问题。它们在运行时丢失。这叫做类型擦除。因此,在运行时,都是可选的

但是,您可以创建两个具体类作为消息使用,封装可选列表并与之匹配。或者,您可以创建一个具体类,让它在字段中保存实体类型并公开它,这样您就可以在match方法的谓词中使用它。

 类似资料:
  • 我只是从阿卡开始,我试图将一些混乱的功能分成更容易管理的部分,每个部分都由不同的演员执行。 我的任务似乎正是适合演员模式的。我有一个对象树,它们保存在数据库中。每个节点都有一些属性;让我们只关注一个,称之为财富。孩子的财富取决于父母的财富。当计算节点上的财富时,这应该会在子节点上触发类似的计算。我想收集节点的所有更新实例,并同时将它们保存在数据库中。 这似乎很简单:一个参与者只需执行计算,然后为当

  • 是否有方法获取创建actor的类。例如,我有一个actorRef或actor selection实例,我想从中获取创建现有actor的类。提前感谢您的回复!

  • 我有父母和孩子。每个儿童演员控制一个装置。当我创建所有的子角色时,我给他们一个uuid。 每个子参与者都是通过设备配置创建的,当配置更改时,我希望通过以下方式重新创建参与者: > 停止旧的: 最终的未来停止了=优雅的停止(actorRef,Duration.create(1,时间单位。秒)); Await.result(停止,Duration.create(1, TimeUnit.二)); 重新创

  • 我正在学习如何使用上下文。为了控制我的参与者的状态,我使用以下代码: 当我发送第一条消息时,“接收”工作并打印消息,第二条消息不显示后,这是我的输出: 如果我改变接收方式,为此: 我收到以下输出: 所以我试着跟踪“接收”被“阻止”的时刻,但没有成功,我的疑问是:当我使用上下文时。在《我的演员》中,Akka如何以及何时处理第一次之后的信息?

  • 我是Akka的新手,我想知道我应该如何处理将工作委托给其他(儿童)演员的演员,但在哪里: 其中一些儿童演员必须按特定顺序参与;和 其中一些子参与者可以以任何顺序参与,并且可以真正地与主/父参与者所做的事情异步执行 假设我有以下儿童演员(不管他们做什么): 假设我有以下调用它们的父参与者: 如你所见: 必须首先“参与”(由家长调用),我们必须等待家长的响应,然后才能继续参与/调用、或 换句话说,当消

  • 我用的是Akka。NET来实现一个actor系统,其中一些actor是按需创建的,并在可配置的空闲时间后删除(我使用Akka的“ReceiveTimeout”机制)。这些参与者中的每一个都由一个密钥标识,并且不应该存在具有相同密钥的两个参与者。 这些参与者当前由一个普通主管创建和删除。可以要求主管返回与给定密钥匹配的参与者的引用,如果具有该密钥的参与者尚不存在,则可以返回现有的参与者,也可以创建新