如何在 Kotlin 中声明具有两种类型的变量,例如 val x:Int 或 String

2023-12-19

我要写一个像这样的方法:

object UIBehavior {
   fun dialog(context: Context, title: Int | String, message: Int | String){
     val dialogObj = AlertDialog.Builder(context)
     dialogObj.setTitle(title)
     dialogObj.setMessage(message)
   }
}

方法对话框对象.setTitle and 对话框对象.setMessage允许两种类型的参数,如何声明可以让该方法的参数dialog只允许Int和String两种类型?


在 Kotlin 中你不能这样做。

但是你可以有一个函数的多个版本,例如

object UIBehavior {
    fun dialog(context: Context, titleId: Int, messageId: Int){
        val titleString = context.getString(titleId)
        val messageString = context.getString(messageId)
        dialog(context, titleString, messageString)
    }

    fun dialog(context: Context, title: String, message: String) {
        val dialogObj = AlertDialog.Builder(context)
        dialogObj.setTitle(title)
        dialogObj.setMessage(message)
    }
}

这样你就可以简单地使用 ids 或字符串调用该函数,看起来你正在使用相同的函数

UIBehavior.dialog(this, R.string.title, R.string.message)
UIBehavior.dialog(this, "title", "message")

您还可以使用常见的超类型Int and String但这会允许更多,我不建议这样做。

fun dialog(context: Context, title: Any, messageId: Any){
    val titleString = when (title) {
        is String -> title
        is Int -> context.getString(title)
        else -> throw IllegalArgumentException("Unsupported type")
    }
    val messageString = when ...
       ...
    dialog(context, titleString, messageString)
}

泛型在这里也不起作用,因为你无法调用dialogObj.setTitle(title)动态地。必须在编译时知道是否要调用Int or the String该函数的重载。这与使用也没有什么不同Any.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Kotlin 中声明具有两种类型的变量,例如 val x:Int 或 String 的相关文章

随机推荐