Akka - 原因:不兼容的类型:Behavior<Message> 无法转换为Behavior<Object>

问题描述 投票:0回答:1

我有一个 OrderManagerActor,它接受来自实现 Message 接口的类的消息。 该接口由以下类 CreateOrderMessage、DeleteOrderMessage、UpdateOrderStatusMessage 实现。

尝试在 OrderManagerActor 中注册 createReceive() 方法时

 @Override
    public Receive<Message> createReceive() {
        return ReceiveBuilder.create()
                .onMessage(CreateOrderMessage.class, this::createOrder)
                .build();
    }

我得到以下信息:

原因:不兼容的类型:Behavior无法转换为Behavior

好吧,我可以确保我的 Actor 收到的所有消息都是对象,但在我看来,这并不完全正确

OrderManagerActor 类

package actor;

import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.*;
import message.Message;
import message.impl.CreateOrderMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class OrderManagerActor extends AbstractBehavior<Message> {
    private final Logger loggerFactory = LoggerFactory.getLogger(OrderManagerActor.class);

    public OrderManagerActor(ActorContext<Message> context) {
        super(context);
    }

    @Override
    public Receive<Message> createReceive() {
        return ReceiveBuilder.create()
                .onMessage(CreateOrderMessage.class, this::createOrder)
                .build();
    }

    private Behavior<Message> createOrder(CreateOrderMessage createOrderMessage) {
        loggerFactory.info(createOrderMessage.toString());
        return this;
    }

    public static Behavior<Message> createBehavior() {
        return Behaviors.setup(OrderManagerActor::new);
    }
}

消息接口:

package message;

public interface Message {
}

消息接口实现:

package message.impl;

import message.Message;

public class CreateOrderMessage implements Message {
    private String id;

    public CreateOrderMessage(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

更新!

我修复了它,需要使用新的ReceiveBuilder构建器。

 @Override
    public Receive<Message> createReceive() {
        return ReceiveBuilder.create()
                .onMessage(CreateOrderMessage.class, this::createOrder)
                .build();
    }

很好,您使用工厂方法对其进行了排序,该方法具有无界类型参数,允许编译器为您推断/填充类型。

需要注意的是,

Behavior<Message>
实际上通常不能转换为
Behavior<Object>

A

Behavior<Message>
意味着通过该行为生成的 Actor 可以处理
Message
类型和
Message
子类型的消息。
Object
不是子类型,而是
Message
的超类型,这意味着您可以将任何想要的对象发送给 actor,这会失败,因为这就是它现在可以处理的对象。

java akka actor actorsystem
1个回答
0
投票

很好,您使用工厂方法对其进行了排序,该方法具有无界类型参数,允许编译器为您推断/填充类型。

需要注意的是,

Behavior<Message>
实际上通常不能转换为
Behavior<Object>

A

Behavior<Message>
意味着通过该行为生成的 Actor 可以处理
Message
类型和
Message
子类型的消息。
Object
不是子类型,而是
Message
的超类型,这意味着您可以将任何想要的对象发送给 actor,这会失败,因为这就是它现在可以处理的对象。

© www.soinside.com 2019 - 2024. All rights reserved.