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
相关产品推荐
相关产品推荐

