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

lam*_*lam 6 types kotlin

我要写一个方法,如:

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

方法dialogObj.setTitledialogObj.setMessage允许两种类型的参数,我如何才能让方法对话框只允许两种类型的参数和字符串?

zap*_*apl 7

你不能在 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

UIBehavior.dialog(this, R.string.title, R.string.message)
UIBehavior.dialog(this, "title", "message")
Run Code Online (Sandbox Code Playgroud)

您也可以使用Intand的常见超类型,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)
}
Run Code Online (Sandbox Code Playgroud)

泛型在这里也不起作用,因为您不能dialogObj.setTitle(title)动态调用。必须在编译时知道是否要调用该函数IntString重载或重载。它也与使用Any.


Dur*_*rdu 0

您可以使用泛型来获得相同的方法,并检查方法主体中的类型。

或者有两种不同的方法。