asynctask和java泛型

asynctask和java泛型,java,android,generics,Java,Android,Generics,我有这门课 public final class AsyncTaskManager<T extends AsyncTask<?, ?, ?> & IProgressTrackerTask & ICancelTask> .... T mAsyncTask; .... public void setupTask(T asyncTask) { mAsyncTask = asyncTask; mAsyncTask.execute(

我有这门课

public final class AsyncTaskManager<T extends AsyncTask<?, ?, ?> & IProgressTrackerTask 
       & ICancelTask> 
....
T mAsyncTask;
....
public void setupTask(T asyncTask) {
    mAsyncTask = asyncTask;
    mAsyncTask.execute();
}
.....
Eclipse说:

Type safety: A generic array of capture#4-of ? is created for a varargs parameter
add @SuppressWarnings("unchecked")
我添加了suppressWarning,但在执行doInBackgound时有ClassCastException。
如上所述,在执行AsyncTask之前必须检查所有类型。
如何解决我的问题-使我的类成为泛型并禁用此警告?
非常感谢

编辑: 只是想澄清一下它是如何使用的。我有一个任务:

public abstract class ManagedAsyncTask<T, E, G> extends AsyncTask<T, E, G> 
implements IProgressTrackerTask, ICancelTask {
公共抽象类ManagedAsyncTask扩展了AsyncTask
实现IProgressTrackerTask、ICancelTask{
以及正在进行实际工作的异步任务:

public class GetTask extends ManagedAsyncTask<Void, Void, SearchResult> {
公共类GetTask扩展了ManagedAsyncTask{
在活动中:

mAsyncTaskManager = new AsyncTaskManager<GetTask>(this, this);
mAsyncTaskManager.setupTask(new GetTask());
mAsyncTaskManager=newasynctaskmanager(this,this);
setupTask(新GetTask());

我不太确定它的泛型部分,但我认为您会遇到这个错误,因为异步任务上的
execute
方法需要
doInBackground
方法的参数作为参数。如果您不需要在
doInBackground
中的任何数据,您可以传递
(Void[])null
(基本上是一个无数组)以满足编译器的要求

以下是AsyncTask的
execute()
方法的文档。如果您仍然有问题,本页的其他部分对配置和使用AsyncTask非常有帮助:

public abstract class ManagedAsyncTask<T, E, G> extends AsyncTask<T, E, G> 
implements IProgressTrackerTask, ICancelTask {


编辑:只是澄清一下,
中的
无效
(无效[])null
应该是
doInBackground
的参数所属的任何类型。我假设,因为您没有向execute传递任何内容,所以您使用Void作为该参数来表示没有必要的数据。您可能以不同的方式实现了它,并且需要相应地强制转换null。

我不太确定generic是它的一部分,但我认为您会遇到这个错误,因为异步任务上的
execute
方法需要
doInBackground
方法的参数作为参数。这将是
AsyncTask
的第一个问号的任何类型的数组。如果您不需要
doInBackground
中的任何数据>,您可以传递
(Void[])null
(本质上是一个无数组)以满足编译器的要求

以下是AsyncTask的
execute()
方法的文档。如果您仍然有问题,本页的其他部分对配置和使用AsyncTask非常有帮助:

public abstract class ManagedAsyncTask<T, E, G> extends AsyncTask<T, E, G> 
implements IProgressTrackerTask, ICancelTask {


编辑:只是澄清一下,
中的
无效
(无效[])null
应该是
doInBackground
的参数所属的任何类型。我假设,由于您没有向execute传递任何内容,所以您使用Void作为该参数来表示没有必要的数据。您可能以不同的方式实现了它,需要相应地强制转换null。

谢谢您的回答,但请参阅:我有抽象AsyncTask,并将此AsyncTask扩展为我的WorkingAsyncTask。这里的所有类型都已检查。我将其放入方法setupTask中,并得到此警告…接受的答案(以及其他一些)这里似乎有一些问题:看起来您不能使用问号来表示AsyncTask参数,因为这样编译器会期望您传递的任何参数都执行扩展?,这不是一个好情况。我认为您的问号必须更具体,要么声明什么?扩展,使其成为对象,要么给出它是另一个通用变量,如T。请查看该问题的答案,看看它们是否有帮助。似乎您是对的!当我尝试公共最终类AsyncTaskManager-确定!但当公共最终类AsyncTaskManager-未选中时:(有什么方法可以改进第二个变量吗?我不太喜欢使用泛型,所以我不能完全确定。在第二种情况下,您使用什么作为执行的参数?您是否尝试过
(T2[])null
?我刚刚用public final更正了字符串…并再次收到此警告(在第二种情况下)。感谢您的回答,但请参阅:我有抽象的AsyncTask,并将此AsyncTask扩展为我的WorkingAsyncTask。此处的所有类型都已检查。我将其放入方法setupTask中并得到此警告…接受的答案(以及其他一些)这里似乎有一些问题:看起来您不能使用问号来表示AsyncTask参数,因为这样编译器会期望您传递的任何参数都执行扩展?,这不是一个好情况。我认为您的问号必须更具体,要么声明什么?扩展,使其成为对象,要么给出它是另一个通用变量,如T。请查看该问题的答案,看看它们是否有帮助。似乎您是对的!当我尝试公共最终类AsyncTaskManager-确定!但当公共最终类AsyncTaskManager-未选中时:(有什么方法可以改进第二个变量吗?我不太使用泛型,所以我不完全确定。在第二种情况下,您使用什么作为执行的参数?您是否尝试过
(T2[])null
?我刚刚用public final更正了字符串…并再次收到此警告(在第二种情况下)。