Java转Kotlin时Google Drive文件列表获取的类型不匹配问题
Kotlin转换Google Drive文件列表代码时的类型不匹配错误
将获取Google Drive文件夹文件列表的Java代码转为Kotlin后,调用getFolderFileList的addOnSuccessListener时触发类型不匹配错误:
所需类型为OnSuccessListener<in ArrayList
!>,实际为OnSuccessListener<ArrayList<GoogleDriveFileHolder?>>
相关依赖
implementation 'com.google.android.gms:play-services-auth:19.0.0' implementation 'com.google.http-client:google-http-client-gson:1.26.0' implementation('com.google.api-client:google-api-client-android:1.26.0') { exclude group: 'org.apache.httpcomponents' } implementation('com.google.apis:google-api-services-drive:v3-rev136-1.25.0') { exclude group: 'org.apache.httpcomponents' }
错误详情
Type mismatch: inferred type is OnSuccessListener<ArrayList<GoogleDriveFileHolder?>> but OnSuccessListener<in ArrayList<GoogleDriveFileHolder>!> was expected
解决方案
1. 确保列表元素非空
问题核心是Kotlin空安全与Java平台类型的冲突:Java的ArrayList<GoogleDriveFileHolder>在Kotlin中被识别为平台类型ArrayList<GoogleDriveFileHolder>!,但代码里监听器接收的是元素可空的ArrayList<GoogleDriveFileHolder?>,与要求类型不兼容。
修改监听器的泛型声明,同时保证构建列表时不添加null元素:
getFolderFileList().addOnSuccessListener { fileList: ArrayList<GoogleDriveFileHolder> -> // 处理非空元素的文件列表 }
2. 显式兼容平台类型(谨慎使用)
如果无法避免列表中出现空元素,可通过类型转换配合抑制警告来兼容,但需自行处理空安全风险:
@Suppress("UNCHECKED_CAST") getFolderFileList().addOnSuccessListener { fileList -> val targetList = fileList as ArrayList<GoogleDriveFileHolder> // 处理列表,注意空元素可能引发的异常 }
3. 调整实体类创建逻辑
检查Kotlin代码中GoogleDriveFileHolder实例的创建流程,确保所有实例都为非空——比如把可能返回null的创建方法改为返回非空类型,或者用requireNotNull等方法强制保证实例非空,从根源消除元素可空的情况。
内容的提问来源于stack exchange,提问作者jetberrocal
相关产品推荐
相关产品推荐

