【问题标题】:Can't override process() method in SwingWorker无法覆盖 SwingWorker 中的 process() 方法
【发布时间】:2013-03-05 17:52:20
【问题描述】:

我有一个 SwingWorker 类如下:

    class RemotePlayersWorker extends SwingWorker<String[][], Object> {
        PlayerCanvas parent;
        RemoteHandler remote;
        String[][] players;
        int maximumConnections;

        public RemotePlayersWorker(PlayerCanvas parentCanvas, RemoteHandler remoteHandle) {
            this.parent = parentCanvas;
            this.remote = remoteHandle;
        }

        @Override
        protected String[][] doInBackground() throws Exception {
            System.out.println("TEST 1");
            players = remote.getConnectedPlayers();
            publish(players);
            return players;
        }

        @Override
        protected void process(List<String[][]> chunks) {
            for (String[][] chunk : chunks) {
                 // no need for the c variable
                 System.out.println(chunk.toString());
              }
        }

        @Override 
        protected void done() {

        }
    }

但是,我在覆盖 process(List chunks) 方法时遇到了错误。 Eclipse 告诉我:

The method process(List) of type PlayerHandler.RemotePlayersWorker must override or implement a supertype method

但是,据我所知,我正确地覆盖了该方法 - 无论我将列表类型设置为什么,我都会收到相同的错误。

还有其他原因我无法覆盖 process() 吗?

我正在使用 java 版本“1.7.0_10”-Java(TM) SE 运行时环境(构建 1.7.0_10-b18)

【问题讨论】:

    标签: java multithreading swing swingworker event-dispatch-thread


    【解决方案1】:

    您对处理方法的签名错误。

    来自 SwingWorker 的签名:protected void process(List&lt;V&gt; chunks)

    V - 用于执行中间结果的类型 SwingWorker 的发布和处理方法

    应该是这样的:

    protected  void process(List<Object> chunks)
    

    【讨论】:

      【解决方案2】:

      您的 process() 方法中的参数不正确

      protected void process(List<Object> chunks) {
         /// do your stuff
      }
      

      需要第二名。 SwingWorker 类的通用数据类型。请阅读documentation

      解释:

      public class SwingWorker<T, V> {
      
          // methods
      
          protected void process(List<V> chunks) {
             // do your stuff
          }
      }
      

      在这里您可以更纯粹地看到process() 方法采用V,在您的情况下为Object

      因此,要么将其更改为List&lt;Object&gt;,要么反转您对 SwingWorker 类的签名(但随后您需要更改 doInBackground() 方法的返回类型)。

      【讨论】:

        【解决方案3】:

        SwingWorker 类定义如下:

        public class SwingWorker<T, V> {
            ...
            protected void process(List<V> chunks) {
                ...
            }
        }
        

        所以,既然你的子类被声明为

        class RemotePlayersWorker extends SwingWorker<String[][], Object> {
        

        process 方法应该将List&lt;Object&gt; 作为参数,而不是List&lt;String[][]&gt;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多