Java:泛型捕获错误

Java:泛型捕获错误,java,generics,capture,Java,Generics,Capture,我试图让下面的代码工作,但没有成功 protected BackgroundTask<?> backgroundTask = null; ... protected <T> void confirmBackgroundAction(final BackgroundTask<T> task, final T arg) { backgroundTask = task; backgroundTask.attach(AbstractWorkerActi

我试图让下面的代码工作,但没有成功

protected BackgroundTask<?> backgroundTask = null;

...

protected <T> void confirmBackgroundAction(final BackgroundTask<T> task, final T arg) {
   backgroundTask = task;
   backgroundTask.attach(AbstractWorkerActivity.this);
   backgroundTask.execute(arg);
}

具体的背景任务看起来像什么

public class SpecificBackgroundTask extends BackgroundTask<Void> {
...
}
public类SpecificBackgroundTask扩展了BackgroundTask{
...
}
试试这个

class Klass {


  protected BackgroundTask<?> backgroundTask = null;

...

  protected <T> void confirmBackgroundAction(final BackgroundTask<T> task, Object arg) {
     backgroundTask = task;
     backgroundTask.attach(AbstractWorkerActivity.this);
     backgroundTask.execute( (T) arg);
  }
}
Klass类{
受保护的BackgroundTask BackgroundTask=null;
...
受保护的无效确认BackgroundAction(最终BackgroundTask任务,对象参数){
背景任务=任务;
backgroundTask.attach(AbstractWorkerActivity.this);
backgroundTask.execute((T)arg);
}
}

在编译时,
BackgroundTask
中的
T
是未知的,并且最多(理论上)可以存储一个类型T,您可以使用它调用
confirbackgroundAction()


编译器无法一致地解决此问题。将
T
更改为您定义的
接口将修复歧义。

当您不分配给
backgroundTask
而使用类型为
backgroundTask
的方法变量时,它是否起作用?没有更多编译错误,但我得到了相同的类强制转换异常。。。我需要将任务分配给BackgroundTask可以提供一个?ie将您的代码简化到问题的本质,尽可能使用标准JDK类,以便我们可以尝试让它在IDE中工作。并提供调用代码的外观。
BackgroundTask BackgroundTask
只能保留1种类型的参数,并正确调用
execute(T arg)
方法。因此,除非您能将其抽象为
接口的用法,否则您可能无法尝试。在编译时,
BackgroundTask
中的
T
是未知的,并且(理论上)最多可以存储一个类型
T
,其中包含多种可能的类型,您可以调用
confirbackgroundaction
。编译器无法一致地解决此问题。将
T
更改为您定义的
接口将修复歧义。不,我无法修复。。。对该函数的每次调用都可以使用不同的类型OK。误解了您的需要,请尝试上面编辑的版本否仍然没有运气;)我仍然有一个ClassCastException
backgroundTask.execute(arg);
((BackgroundTask<T>)backgroundTask).execute(arg);
confirmBackgroundAction(new SpecificBackgroundTask(), (Void) null);
public class SpecificBackgroundTask extends BackgroundTask<Void> {
...
}
class Klass {


  protected BackgroundTask<?> backgroundTask = null;

...

  protected <T> void confirmBackgroundAction(final BackgroundTask<T> task, Object arg) {
     backgroundTask = task;
     backgroundTask.attach(AbstractWorkerActivity.this);
     backgroundTask.execute( (T) arg);
  }
}