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