проблема с переопределением метода generi c в ScheduledThreadPoolExecutor - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь переопределить этот метод из java .util.concurrent.ScheduledThreadPoolExecutor

protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable,RunnableScheduledFuture<V> task)

, и я получаю эту ошибку:

incompatible types: java.util.concurrent.Callable<X> cannot be converted to java.util.concurrent.Callable<X>

со ссылкой на строку:

QueueItemTask t2 = new QueueItemTask(c, task);

из этого класса:

package test;

import org.apache.log4j.Logger;

//import java.util.concurrent.*;                                                
import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.ExecutionException;

import test.QueueItem;

public class Queue<X extends QueueItem> extends ScheduledThreadPoolExecutor {

    @Override
    protected <X> RunnableScheduledFuture<X> decorateTask(
                                                        Callable<X> c, RunnableScheduledFuture<X> task) {
        QueueItemTask t2 = new QueueItemTask(c, task);                

        return (RunnableScheduledFuture<X>)t2;
    }

    public Queue(){
        super(1); // only one thread                                            
    }

    public class QueueItemTask
        extends FutureTask<X>
        implements RunnableScheduledFuture<X>
    {
        Logger log = Logger.getLogger(this.getClass());

        private Callable<X> item;
        private RunnableScheduledFuture<X> task;

        public QueueItemTask(Callable<X> item, RunnableScheduledFuture task){
            super(item);

            this.item = item;
            this.task = task;
        }

        public X getItem(){
            return (X)this.item;
        }

        public void run() {
            task.run();
        }
       public boolean isPeriodic() {
            return task.isPeriodic();
        }
        public boolean cancel(boolean mayInterruptIfRunning) {
            return task.cancel(mayInterruptIfRunning);
    }
        public boolean isCancelled() {
            return task.isCancelled();
        }
        public boolean isDone() {
            return task.isDone();
        }
        public X get()
            throws InterruptedException, ExecutionException {
            return task.get();
        }
        public X get(long timeout, TimeUnit unit)
            throws InterruptedException, ExecutionException, TimeoutException {
            return task.get(timeout, unit);
        }
    public long getDelay(TimeUnit unit) {
            return task.getDelay(unit);
        }
        public int compareTo(Delayed o) {
            return task.compareTo(o);
        }
    }

}

Я пробовал также без дженериков - просто используя QueueItem вместо X и получаю в основном ту же ошибку, за исключением одного типа c generi полностью квалифицирован, ie.

incompatible types: java.util.concurrent.Callable<QueueItem> cannot be converted to java.util.concurrent.Callable<test.QueueItem>

любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Добавьте параметр типа X в объявление класса QueueItemTask и не перезаписывайте тип V в методе decorateTask типом X:

import test.QueueItem;

public class Queue<X extends QueueItem> extends ScheduledThreadPoolExecutor {

  @Override
  protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> c, RunnableScheduledFuture<V> task) {
      QueueItemTask<V> t2 = new QueueItemTask<V>(c, task);                
      return t2;
  }

  public Queue() {
    super(1); // only one thread
  }

  public static class QueueItemTask<X>
      extends FutureTask<X>
      implements RunnableScheduledFuture<X> {

    private Callable<X> item;
    private RunnableScheduledFuture<X> task;

    public QueueItemTask(Callable<X> item, RunnableScheduledFuture<X> task) {
      super(item);

      this.item = item;
      this.task = task;
    }

    public X getItem() {
      return (X) this.item;
    }

    public void run() {
      task.run();
    }

    public boolean isPeriodic() {
      return task.isPeriodic();
    }

    public boolean cancel(boolean mayInterruptIfRunning) {
      return task.cancel(mayInterruptIfRunning);
    }

    public boolean isCancelled() {
      return task.isCancelled();
    }

    public boolean isDone() {
      return task.isDone();
    }

    public X get()
        throws InterruptedException, ExecutionException {
      return task.get();
    }

    public X get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException {
      return task.get(timeout, unit);
    }

    public long getDelay(TimeUnit unit) {
      return task.getDelay(unit);
    }

    public int compareTo(Delayed o) {
      return task.compareTo(o);
    }
  }

}
0 голосов
/ 18 июня 2020

закрытие этого вопроса b / c Я попробовал другой javac, который дал более полезную ошибку:

несовместимые типы: Callable не может быть преобразован в Callable QueueItemTask t2 = new QueueItemTask (c, задача); //, задача); ^ где X # 1, X # 2 являются переменными типа: X # 1 расширяет объект, объявленный в методе decorateTask (Callable, RunnableScheduledFuture) X # 2 расширяет QueueItem, объявленный в классе Queue

...