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);
}
}