我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)

Posted

技术标签:

【中文标题】我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)【英文标题】:What object should I pass to a function that requires Void! in a parameter? (Kotlin)我应该将什么对象传递给需要 Void 的函数!在参数中? (科特林) 【发布时间】:2021-12-31 11:35:08 【问题描述】:

我正在使用合约 ActivityResultContracts.TakePicturePreview() 来捕获一个小图像。

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

当我尝试为 Result 启动 Activity 时,我意识到这个合约需要一个 Void!对象作为输入。因此,我可以启动此活动的唯一方法是将“null”作为参数传递,我认为这不是很漂亮。

cameraLauncher.launch(null)

我尝试过传递“Nothing”、“Unit”,但类型不匹配。

这样做的正确方法是什么?

该函数的标题是

public void launch(Void input)

【问题讨论】:

你试过cameraLauncher.launch()吗? activity-ktx 中有一个 Kotlin 扩展程序可以为您处理这种情况。 @ianhanniballake 哦,谢谢 :) 我已经尝试过了,它可以工作。发问题之前,我没有导入activity-ktx,所以这个扩展功能不可用。有了这个库,这段代码更漂亮了! 【参考方案1】:

根据 Java 文档,

Void 类是一个不可实例化的占位符类,用于保存对代表 Java 关键字 void 的 Class 对象的引用

由于 Void 类无法实例化,因此您可以传递给具有 Void 类型参数的方法的唯一值是 null

首先需要这样做的原因是因为所有 ActivityContracts 都继承自基础 abstract class ActivityResultContract&lt;I, O&gt;,它需要输入 (I) 和输出 (O) 两种数据类型。由于TakePicturePreview 不需要任何输入,因此它使用Void? 来弥补这一点。

现在回答,

这样做的正确方法是什么?

传递null 是正确的(也是唯一的)方法。

【讨论】:

以上是关于我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)的主要内容,如果未能解决你的问题,请参考以下文章

我应该将啥“长度”参数传递给 SqlDataReader.GetBytes()

导入 tkinter 文件时,我应该将啥参数传递给“root”?

我可以/应该将 Connection 对象传递给函数吗?

将参数传递给夹具函数

将 ListBox 控件对象传递给需要 ListBox 作为参数的函数

如何将 std::function 对象传递给采用函数指针的函数?