Android-如何在运行时动态选择具有不同泛型类型的AsyncTask?

时间:2019-03-24 00:59:49

标签: android generics polymorphism

首先让我说我是一位经验丰富的Python开发人员,他对Android / Java生态系统感到非常迷茫。我很难理解我期望的是多态性的非常简单的用法。我要解决的确切问题是,我有一个活动需要在运行时根据传入数据选择实现。

对于我的第一个功能,处理文件,我发现我需要实现AsyncTask来减轻读取文件和处理内容的实际工作。没问题,我实现了AsyncTask,如下所示:

class UploadUriTask extends AsyncTask<Uri, Integer, String>

我在活动类中添加了类型为UploadUriTask的成员变量,并且一切正常:

private UploadUriTask task;

但是,我要添加的第二个功能是处理URL而不是文件。虽然我的第一个AsyncTask实现将其Params设置为Uri[],但是此新任务需要将其命名为String[]

class UploadUrlTask extends AsyncTask<String, Integer, String>

目前,我认为这两个类都扩展了AsyncTask,因此我可以将我的成员变量更改为AsyncTask

private AsyncTask task;

在创建活动时,我检查传入的数据类型并实例化适当的任务:

if (dataType.equals("image/*")) {
  task = new UploadUriTask(this);
}
else {
  task = new UploadUrlTask(this);
}

但是,现在我的任何一个任务被调用时,Params类型都将转换为Object[]而不是Uri[]String[],这由我得到的错误证明致电task.execute(url)时:

java.lang.ClassCastException: java.lang.Object[] cannot be cast to java.lang.String[]

我觉得这里只是缺少一些显而易见的东西,但是我似乎找不到合适的搜索条件。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题出在private AsyncTask task;上,您的变量存储为原始类型,因此所有类型参数都将被删除。 AsyncTask类型参数是无界的,因此当像这样擦除类型参数时,它们默认为Object(java类根)。 这就是为什么execute然后期望类型为Object[]的参数的原因

here所述

  

如果您未指定类型,则编译器将无法猜测类型   声明变量。

根据例外情况,Object[]不能转换为String[],因为String[]不是Object[]的子类