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

Android-如何在运行时动态选择具有不同泛型类型的异步任务?,android,generics,polymorphism,Android,Generics,Polymorphism,首先让我说,我是一名经验丰富的Python开发人员,在Android/Java生态系统中感到非常失落。我很难理解我所期望的多态性的一个非常简单的用法。我试图解决的确切问题是,我有一个活动需要在运行时根据传入的数据选择一个实现 对于我的第一个特性,处理文件,我发现我需要实现一个异步任务来减轻读取文件和处理内容的实际工作。没问题,我实现了AsyncTask,如下所示: class UploadUriTask扩展了AsyncTask 我在我的活动类中添加了一个类型为UploadUriTask的成员变量

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

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

class UploadUriTask扩展了AsyncTask

我在我的活动类中添加了一个类型为
UploadUriTask
的成员变量,一切都很顺利:

私有上传任务

但是,我想添加的第二个特性是处理URL而不是文件。虽然我的第一个AsyncTask实现将其
参数作为
Uri[]
,但此新任务需要将其作为
字符串[]

class UploadUrlTask扩展了AsyncTask

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

私有异步任务

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

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[]不能强制转换为java.lang.String[]


我觉得我只是错过了一些非常明显的东西,但我似乎找不到合适的词来搜索。任何帮助都将不胜感激。

问题在于
私有异步任务您的变量存储为原始类型,因此所有类型参数都将被擦除
AsyncTask
类型参数是无界的,因此当类型参数像那样被擦除时,它们默认为
对象(java类根)。
这就是为什么执行
execute
然后需要类型为
Object[]

如更详细的解释

如果在编译时未指定类型,编译器将无法猜测该类型 声明变量


根据例外情况,
Object[]
不能强制转换为
String[]
,因为
String[]
不是
Object[]

的子类,问题在于
私有异步任务您的变量存储为原始类型,因此所有类型参数都将被擦除
AsyncTask
类型参数是无界的,因此当类型参数像那样被擦除时,它们默认为
对象(java类根)。
这就是为什么执行
execute
然后需要类型为
Object[]

如更详细的解释

如果在编译时未指定类型,编译器将无法猜测该类型 声明变量


根据例外情况,
Object[]
不能强制转换为
String[]
,因为
String[]
在概念上不是
Object[]

OK的子类,但我不能在声明时指定它,因为它需要在运行时动态选择。我只是在本地声明它,但在另一个类方法override.OK中需要它,这在概念上是有意义的,但我不能在声明时指定它,因为它需要在运行时动态选择。我只是在本地声明它,但在另一个类方法重写中需要它。