Я пытаюсь переопределить этот метод из 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>
любая помощь приветствуется!