Невозможно переопределить метод process() в SwingWorker

У меня есть класс 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). Затмение говорит мне следующее:

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

Однако, насколько я могу судить, я правильно переопределяю метод - я получаю ту же ошибку независимо от того, какой тип списка я установил.

Есть ли какая-то другая причина, по которой я не смогу переопределить process()?

Я использую версию Java "1.7.0_10" - Java(TM) SE Runtime Environment (сборка 1.7.0_10-b18)


person BnMcG    schedule 17.03.2013    source источник


Ответы (3)


Класс SwingWorker определяется следующим образом:

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

Итак, поскольку ваш подкласс объявлен как

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

Метод процесса должен принимать List<Object> в качестве аргумента, а не List<String[][]>

person JB Nizet    schedule 17.03.2013

У вас неправильный параметр в вашем методе process(), он должен быть

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

Требуется 2-й. общий тип данных класса SwingWorker. Прочтите документацию.

Объяснение:

public class SwingWorker<T, V> {

    // methods

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

Здесь вы можете более четко увидеть, что метод process() принимает V, то есть в вашем случае Object.

Поэтому либо измените его на List<Object>, либо измените свою подпись класса SwingWorker (но тогда вам нужно изменить возвращаемый тип метода doInBackground()).

person Simon Dorociak    schedule 17.03.2013

Ваша подпись для метода процесса неверна.

Подпись от SwingWorker: protected void process(List<V> chunks)

V — тип, используемый для выполнения промежуточных результатов методами публикации и обработки данного SwingWorker.

Так должно быть:

protected  void process(List<Object> chunks)
person giorashc    schedule 17.03.2013