You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 00:05:02