Java akka child actor给出了一个类强制类型转换异常
我的akka java项目使用play框架来实现rubine算法,我有一个问题,我想与社区分享,希望得到一个解决方案 该项目包含一个akka主演员,该主演员创建一个子演员。然后,子参与者初始化执行某些任务的java类。任务的数据由使用websocket和json对象的web接口提供。json对象包含双重数据类型。play framework应用程序类从web界面获取数据并将其传递给主参与者。然后主参与者创建一个子参与者并将数据传递给子参与者。下面是代码片段。相关章节高度关注 这来自应用程序类:Java akka child actor给出了一个类强制类型转换异常,java,playframework,akka,Java,Playframework,Akka,我的akka java项目使用play框架来实现rubine算法,我有一个问题,我想与社区分享,希望得到一个解决方案 该项目包含一个akka主演员,该主演员创建一个子演员。然后,子参与者初始化执行某些任务的java类。任务的数据由使用websocket和json对象的web接口提供。json对象包含双重数据类型。play framework应用程序类从web界面获取数据并将其传递给主参与者。然后主参与者创建一个子参与者并将数据传递给子参与者。下面是代码片段。相关章节高度关注 这来自应用程序类:
public class Application extends Controller {
static ActorRef masterActor;
RubineActor rubineactor;
public static Result index() {
return ok(index.render(null)); }
public static WebSocket<JsonNode> sockHandler() {
return new WebSocket<JsonNode>() {
// called when the websocket is established
public void onReady(final WebSocket.In<JsonNode> in, final WebSocket.Out<JsonNode> out) {
try{ RubineActor.connectMaster(in, out); }
catch(Exception e){e.printStackTrace();}
} }; } }
公共类应用程序扩展控制器{
静态ActorRef主演员;
鲁宾主义者鲁宾主义者;
公共静态结果索引(){
返回ok(index.render(null));}
公共静态WebSocket sockHandler(){
返回新的WebSocket(){
//在建立websocket时调用
public void onReady(最终WebSocket.In,最终WebSocket.Out){
请尝试{RubineActor.connectMaster(输入,输出);}
catch(异常e){e.printStackTrace();}
} }; } }
这是主演员的话:
public class RubineActor extends UntypedActor {
static ObjectMapper mapper;
Map<String,ArrayList<Double>> jsonMap;
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
ActorRef childActor = getContext().actorOf(new Props(ChildActor.class), "childactor");
static ActorRef masterActor = Akka.system().actorOf(new Props(RubineActor.class));
public static void connectMaster (final WebSocket.In<JsonNode> in,
final WebSocket.Out<JsonNode> out)
{ in.onMessage(new Callback<JsonNode>() {
public void invoke(JsonNode event) throws JsonParseException, JsonMappingException,
IOException {
ObjectMapper mapper = new ObjectMapper();
@SuppressWarnings("unchecked")
Map<String,ArrayList<Double>> jsonMap = mapper.readValue(event, Map.class);
masterActor.tell(new Coordinates(jsonMap));
("timeArray").toString(); } }); }
@Override
public void onReceive(Object message) throws Exception {
if(message instanceof Coordinates)
{Coordinates msg = (Coordinates) message;
childActor.tell(msg); }
else { unhandled(message);} }
public static class Coordinates {
Map <String,ArrayList<Double>> jsonMap = null;
public Coordinates (Map <String,ArrayList<Double>> jsonMap ) {
super();
this.jsonMap = jsonMap; } }}
this is from the child actor
public class ChildActor extends UntypedActor {
public ChildActor (){}
@Override
public void onReceive(Object msg) throws Exception
if(msg instanceof Coordinates) {
Coordinates cood = (Coordinates) msg;
new Gesture(cood.jsonMap);
}
else { unhandled(msg);} }}
public类RubineActor扩展了UntypedActor{
静态对象映射器;
地图jsonMap;
LoggingAdapter log=Logging.getLogger(getContext().system(),this);
ActorRef childActor=getContext().actorOf(新道具(childActor.class),“childActor”);
静态ActorRef masterActor=Akka.system().actorOf(新道具(RubineActor.class));
公共静态void connectMaster(最终WebSocket.In,
最终WebSocket.Out(输出)
{in.onMessage(新回调(){
公共void调用(JsonNode事件)抛出JsonParseException、JsonMappingException、,
IOException{
ObjectMapper mapper=新的ObjectMapper();
@抑制警告(“未选中”)
Map jsonMap=mapper.readValue(事件,Map.class);
tell(新坐标(jsonMap));
(“timeArray”).toString();}}}
@凌驾
public void onReceive(对象消息)引发异常{
if(坐标的消息实例)
{Coordinates msg=(Coordinates)消息;
childActor.tell(msg);}
else{未处理(消息);}
公共静态类坐标{
Map jsonMap=null;
公共坐标(地图jsonMap){
超级();
this.jsonMap=jsonMap;}}
这是儿童演员的作品
公共类ChildActor扩展了非类型转换器{
公共子角色(){}
@凌驾
public void onReceive(对象消息)引发异常
if(msg instanceof坐标){
坐标cood=(坐标)msg;
新姿态(cood.jsonMap);
}
else{unhandled(msg);}}}
这来自普通java类:
Map<String, ArrayList<Double>> jsonMap ;
Map <String,ArrayList<Long>> jsonMap2 ;
public Gesture(){}
public Gesture (Map<String, ArrayList<Double>> jsonMap)
{ this.jsonMap = jsonMap;
npoints = jsonMap.size();
intial_Theta(); }
public void intial_Theta() {
// this line produces a class cast exception error.the error is given below.
double dx = jsonMap.get("x").get(2) - jsonMap.get("x").get(0);}
Map-jsonMap;
地图jsonMap2;
公共手势(){}
公共手势(Map jsonMap)
{this.jsonMap=jsonMap;
npoints=jsonMap.size();
初始θ();}
公共无效初始_Theta(){
//此行产生类强制转换异常错误。错误如下所示。
double dx=jsonMap.get(“x”).get(2)-jsonMap.get(“x”).get(0);}
这是错误消息:
[info] Compiling 4 Scala sources and 10 Java sources to C:\Users\FAISAL\workspac
e\Sketch_Server\target\scala-2.9.1\classes...
[info] play - Application started (Dev)
[info] play - Starting application default Akka system.
[ERROR] [08/07/2012 05:15:11.187] [application-akka.actor.default-dispatcher-3]
[akka://application/user/$a/childactor] java.lang.Integer cannot be cast to java
.lang.Double
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Doub
le
at model.Gesture.intial_Theta(Gesture.java:90)
at model.Gesture.<init>(Gesture.java:74)
at model.ChildActor.onReceive(ChildActor.java:19)
at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:1
54)
at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:1
53)
at akka.actor.Actor$class.apply(Actor.scala:318)
at akka.actor.UntypedActor.apply(UntypedActor.scala:93)
at akka.actor.ActorCell.invoke(ActorCell.scala:626)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197)
at akka.dispatch.Mailbox.run(Mailbox.scala:179)
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(
AbstractDispatcher.scala:516)
at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
[info]将4个Scala源代码和10个Java源代码编译为C:\Users\FAISAL\workspac
e\Sketch\u Server\target\scala-2.9.1\classes。。。
[信息]播放-应用程序已启动(开发)
[信息]播放-启动应用程序默认Akka系统。
[错误][08/07/2012 05:15:11.187][应用程序akka.actor.default-dispatcher-3]
[akka://application/user/$a/childactor]java.lang.Integer不能强制转换为java
朗先生,双人
java.lang.ClassCastException:java.lang.Integer不能转换为java.lang.Doub
乐
在model.signature.initial_Theta(signature.java:90)
在model.signature.(signature.java:74)
位于model.ChildActor.onReceive(ChildActor.java:19)
在akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:1
54)
在akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:1
53)
在akka.actor.actor$class.apply(actor.scala:318)
在akka.actor.UntypedActor.apply(UntypedActor.scala:93)
在akka.actor.ActorCell.invoke(ActorCell.scala:626)
位于akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197)
在akka.dispatch.Mailbox.run(Mailbox.scala:179)
在akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(
AbstractDispatcher.scala:516)
在akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259)
位于akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
位于akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
在akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
如果有任何建议,我将非常高兴。在我看来,这并不是关于Akka或Play的,只是JSON数据中有
Integer
值
在类型安全语言中,由于您将变量声明为ArrayList
,所以您可能不希望发生这种情况,但Java适合您。下面是一个简化版本,它再现了您的问题:
import java.util.HashMap;
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
public class x {
static void breakMap(Map x) {
ArrayList<Integer> l = new ArrayList<Integer>();
l.add(new Integer(1));
x.put("foo", l);
};
public static void main(String[] args) {
Map<String, ArrayList<Double>> x = new HashMap<String, ArrayList<Double> >();
breakMap(x);
ArrayList<Double> y = x.get("foo");
Double z = y.get(0);
}
}
import java.util.HashMap;
导入java.util.Map;
导入java.util.List;
导入java.util.ArrayList;
公共类x{
静态空洞断开贴图(贴图x){
ArrayList l=新的ArrayList();
l、 加(新整数(1));
x、 put(“foo”,l);
};
公共静态void main(字符串[]args){
Map x=新的HashMap();
breakMap(x);
ArrayList y=x.get(“foo”);
双z=y.get(0);
}
}
给予
线程“main”java.lang.ClassCastException中的异常:无法将java.lang.Integer转换为java.lang.Double
在x.main(x.java:20)
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
at x.main(x.java:20)