Anylogic报Type mismatch无法将Agent转换为MyAgent问题咨询
类型不匹配报错:无法将Agent类型转换为自定义MyAgent类型
问题场景
- 实现目标:获取Wait Block中0号位置智能体(即
wait.get(0))东侧路径上距离最近的智能体 - 前置确认:路径上流转的所有智能体均为自定义
MyAgent类型 - 报错信息:指定代码行抛出
Type mismatch: cannot convert from Agent to MyAgent类型不匹配错误
报错代码片段如下:
MyAgent leading_agent; MyAgent trailing_agent; double separation = 0.0; // 校验已有飞行器进入进近阶段 if(moveToApproach.in.count()>0) { // 校验队列中至少有一架飞行器 if (wait.size()>0) { //***** 下方这行代码抛出错误 ****** leading_agent = wait.get(0).getAgentNextToMe(EAST); //******************************************** trailing_agent = wait.get(0); trailing_agent.plane.setVisible(true); } }
报错原因
getAgentNextToMe()是AnyLogic顶层Agent基类的内置方法,方法声明的返回值类型固定为Agent基类,编译阶段不会自动识别你实际传入的自定义智能体子类类型,不会做隐式向下转型,因此直接将返回值赋值给MyAgent类型的变量就会触发类型不匹配错误。
代码中trailing_agent = wait.get(0);没有报错,是因为你已经提前给Wait模块配置了泛型,指定该模块容纳的智能体类型为MyAgent,所以wait.get(0)的返回值本身就是MyAgent类型,不需要额外转型。
修复方案
直接对getAgentNextToMe()的返回值做强制类型转换即可,将报错行替换为以下代码:
leading_agent = (MyAgent) wait.get(0).getAgentNextToMe(EAST);
如果需要规避极端情况下其他类型智能体误入路径导致的运行时类型转换异常,可以增加类型判断逻辑,写法更稳妥:
Agent adjacentAgent = wait.get(0).getAgentNextToMe(EAST); if (adjacentAgent instanceof MyAgent) { leading_agent = (MyAgent) adjacentAgent; // 后续针对leading_agent的业务逻辑写在判断块内即可 }
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

