java - asynctask 和 java 泛型

标签 java android generics

我有这门课

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/

相关文章:

android - 有什么办法可以找到默认的 Activity 过渡动画是什么?

java - 如何用 PHP 或 Java 发送电子邮件

java - 在 Eclipse 中更新 ADT 导致许多错误

Java 枚举 - 无法在定义之前引用字段

android - 向上滚动时自定义 ListView 然后隐藏进度条进程

swift - 使用通用闭包进行类型匹配的奇怪行为

java - php很有限吗?

android - Cordova PushPlugin : Android won't play push sound while app not running

c# - 如何将 C# 通用方法调用分派(dispatch)到专用方法调用中

generics - 不满意 : inferred type T? 不是 Any 的子类型