首先让我说我是一位经验丰富的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[]
我觉得这里只是缺少一些显而易见的东西,但是我似乎找不到合适的搜索条件。任何帮助将不胜感激。
答案 0 :(得分:0)
问题出在private AsyncTask task;
上,您的变量存储为原始类型,因此所有类型参数都将被删除。 AsyncTask
类型参数是无界的,因此当像这样擦除类型参数时,它们默认为Object
(java类根)。
这就是为什么execute
然后期望类型为Object[]
的参数的原因
如here所述
如果您未指定类型,则编译器将无法猜测类型 声明变量。
根据例外情况,Object[]
不能转换为String[]
,因为String[]
不是Object[]
的子类