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

Android Kotlin:同继承AppCompatActivity的两个子类如何强制转换

错误原因

你的UploadActivity和ParseUploadActivity是平级类,二者都直接继承AppCompatActivity,不存在父子继承关系,不同子类之间无法直接进行类型强转,强制转换必然抛出ClassCastException。
另外你注释的ParseUploadActivity().uploader(this, it1)写法也不可行:Activity实例必须由系统框架创建,手动new出来的Activity没有绑定上下文环境,无法正常执行相关逻辑。

解决方案

根据你的使用场景可选择以下三种方案:

方案1:抽取公共父类复用方法

如果两个Activity都需要用到uploader方法,可以先抽取公共父类,把通用方法放到父类中:

// 公共父类
open class BaseUploadActivity : AppCompatActivity() {
    fun uploader(context: Context, fileUri: Uri) {
        // 原有uploader方法的实现逻辑
    }
}

// 修改两个Activity的继承关系
class UploadActivity : BaseUploadActivity() {
    // 原有代码不变,调用时直接写即可,无需强转
    btnUploadImage.setOnClickListener {
        filePath?.let { it1 -> 
            sm.uploadImage(this, it1)
            thread {
                Thread.sleep(1000)
                uploader(this, it1)
            }
        }
    }
}

class ParseUploadActivity : BaseUploadActivity() {
    // 原有代码不变
}

方案2:抽取工具类

如果uploader方法不需要绑定Activity的专属逻辑,可以直接抽为独立工具类:

object UploadUtil {
    fun uploader(context: Context, fileUri: Uri) {
        // 原有uploader方法的实现逻辑
    }
}

// 调用处直接使用工具类即可
UploadUtil.uploader(this, it1)

方案3:跳转传参到ParseUploadActivity

如果你是需要跳转到ParseUploadActivity后执行上传逻辑,直接通过Intent传递Uri参数即可:

// UploadActivity中启动目标Activity并传参
val intent = Intent(this@UploadActivity, ParseUploadActivity::class.java)
intent.putExtra("file_uri", it1.toString())
startActivity(intent)

// ParseUploadActivity中接收参数并执行上传
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val uriStr = intent.getStringExtra("file_uri")
    val fileUri = Uri.parse(uriStr)
    uploader(this, fileUri)
}

额外注意

你当前用Thread.sleep(1000)等待Firebase上传完成的逻辑不可靠,建议使用Firebase Storage的上传完成回调触发后续操作,避免因网络波动导致后续逻辑执行时上传还未完成。

内容的提问来源于stack exchange,提问作者totta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:06