【问题标题】:JAVA incompatible types: Object cannot be converted to my typeJAVA 不兼容的类型:对象无法转换为我的类型
【发布时间】:2015-05-15 01:11:36
【问题描述】:

我正在尝试通过在单独的线程上进行工作并返回所需的对象来更改我在 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()); }
    }
});

【问题讨论】:

  • 当你说“得到错误”时,我假设你的意思是编译错误而不是运行时错误。你试过投射吗?
  • 是的,编译错误,抱歉。

标签: java javafx


【解决方案1】:

这是因为task.get() 正在返回一个Object 类型的值,但您试图将其分配给v,即VideoScrollPane。您可以通过进行强制转换来防止错误,就像这样

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

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

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

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

这样,task.get() 现在将返回 VideoScollPane,并且您不需要演员表。

【讨论】:

  • 改正任务的声明比使用不必要的向下转换要好。这样可以确保返回的实际对象是正确的类型。
  • @James_D 谢谢,我已经附上了一个注释!
  • 我已按照建议更正了声明。感谢您的帮助。
【解决方案2】:

您错误地声明了您的Task。你需要

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

【讨论】:

    【解决方案3】:

    你的task.get();的返回类型是Object而不是VideoScrollPane,改成:

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

    【讨论】:

    • 不是这样。 Task&lt;V&gt; 中的声明,继承自 FutureTask&lt;V&gt;public V get()。所以错误的不是返回类型的赋值,而是Task 实例的声明。
    猜你喜欢
    • 2017-11-09
    • 2021-12-12
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多