我有这门课
public final class AsyncTaskManager<T extends AsyncTask<?, ?, ?> & IProgressTrackerTask
& ICancelTask>
....
T mAsyncTask;
....
public void setupTask(T asyncTask) {
mAsyncTask = asyncTask;
mAsyncTask.execute();
}
.....
但是上线了
mAsyncTask.execute();
Eclipse 说:
Type safety: A generic array of capture#4-of ? is created for a varargs parameter
add @SuppressWarnings("unchecked")
我添加了suppressWarning,但在执行doInBackgound期间出现ClassCastException。
如前所述here在执行 AsyncTask 之前必须检查所有类型。
如何解决我的问题 - 使我的类通用并禁用此警告?
非常感谢!
编辑: 只是为了澄清如何使用。我有抽象 AsyncTask:
public abstract class ManagedAsyncTask<T, E, G> extends AsyncTask<T, E, G>
implements IProgressTrackerTask, ICancelTask {
和 AsyncTask 正在做真正的工作:
public class GetTask extends ManagedAsyncTask<Void, Void, SearchResult> {
在 Activity 中:
mAsyncTaskManager = new AsyncTaskManager<GetTask>(this, this);
mAsyncTaskManager.setupTask(new GetTask());
最佳答案
我不太确定它的通用部分,但我认为您会收到该错误,因为 execute
AsyncTask 上的方法需要 doInBackground
的参数作为参数方法。这将是 AsyncTask<?, ?, ?>
第一个问号的任何类型的数组。 。如果您不希望 doInBackground
中有任何数据,您可以通过(Void[])null
(本质上是一个没有任何内容的数组)以满足编译器的要求。
这是 execute()
的文档AsyncTask 的方法。如果您仍然遇到问题,此页面的其他部分对于配置和使用 AsyncTask 非常有帮助:
http://developer.android.com/reference/android/os/AsyncTask.html#execute%28Params...%29
编辑:只是为了澄清一下, Void
在(Void[])null
doInBackground
的参数应该是任何类型是。我假设,由于您没有将任何内容传递给执行,因此您使用 Void 作为该参数来指示没有必要的数据。您可能以不同的方式实现它,并且需要相应地转换 null。
关于java - asynctask 和 java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12390774/