JAVA不兼容的类型:无法将对象转换为我的类型

我试图通过在单独的线程上进行工作并返回所需的对象来对JavaFX中的GUI进行更改。但是,在完成工作和task.setOnSucceeded()之后,我尝试检索创建的对象并得到错误“不兼容的类型:对象无法转换为VideoScrollPane类型”。

我认为这与原始类型有关,因为它发生在侦听器中,但是四处查看后,我找不到我想要的建议。

任何可以散发出的光将不胜感激。

Task task = new Task<VideoScrollPane>() {

VideoScrollPane vsp;

@Override protected VideoScrollPane call() {

try {

System.out.print("thread...");

ExecutorService executor = Executors.newCachedThreadPool();

Future<VideoScrollPane> future = executor.submit(new Callable<VideoScrollPane>() {

@Override public VideoScrollPane call() {

return new VideoScrollPane(mediaview, vboxCentre, username, project);

}

});

vsp = future.get();

} catch(Exception exception) { System.out.println(exception.getMessage()); }

return vsp;

}

};

new Thread(task).start();

task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {

@Override public void handle(WorkerStateEvent t) {

System.out.println("complete");

try {

//where the problem occurs

VideoScrollPane v = task.get();

} catch(Exception exception) { System.out.println(exception.getMessage()); }

}

});

回答:

这是因为task.get()会传回type的值Object,但您正尝试将其指派给v,即v

VideoScrollPane。您可以通过强制转换来防止错误,例如

VideoScrollPane v = (VideoScrollPane)task.get();

请注意,如果task.get()返回的不是VideoScrollPane,则会得到ClassCastException

但是,如果您想完全避免问题,请考虑task通过包含泛型参数的类型来修复的声明。您可以将其更改为

Task<VideoScrollPane> task = new Task<VideoScrollPane>() {

这样,task.get()现在将返回VideoScollPane,并且您不需要强制转换。

以上是 JAVA不兼容的类型:无法将对象转换为我的类型 的全部内容, 来源链接: utcz.com/qa/415805.html

回到顶部