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

Kotlin中参数要求为Void!类型的函数应当传入什么对象?

问题背景

我正在使用ActivityResultContracts.TakePicturePreview()协议拍摄小尺寸图片。

private val cameraLauncher =
        registerForActivityResult(ActivityResultContracts.TakePicturePreview()) { bitmap ->
                view?.findViewById<ImageView>(R.id.imageOutput)?.setImageBitmap(bitmap)
        }

当我尝试启动该Activity for Result时,发现该协议要求传入Void!类型的对象作为入参。目前我只能传入null作为参数启动该activity,我认为这种写法不够优雅。

cameraLauncher.launch(null)

我尝试过传入Nothing、Unit,但都提示类型不匹配。请问正确的实现方式是什么?
该函数的方法头定义如下:

public void launch(Void input)

解答

首先你当前的写法完全符合官方设计逻辑,不需要有顾虑:
Java中的Void是特殊占位类,本身没有可实例化的对象,所有要求传入Void类型参数的场景,唯一合法的取值就是null。你看到的入参类型Void!是Kotlin对Java平台类型的标识,代表这个参数可空也可非空,但实际上因为Void没有实例,所以只能传null。

你尝试传入的Unit、Nothing都是Kotlin自有类型,和Java的Void类型不兼容,自然会报类型不匹配错误。

如果觉得写null不符合Kotlin的使用习惯不够优雅,可以用Kotlin扩展函数封装一层,实现无参调用:

// 给入参为Void的ActivityResultLauncher添加无参launch扩展
fun ActivityResultLauncher<Void>.launch() = launch(null)

封装后就可以直接用无参方式调用:

cameraLauncher.launch()

内容的提问来源于stack exchange,提问作者Pau Garcia Gozàlvez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:24:03