我要写一个方法,如:
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.setTitle和dialogObj.setMessage允许两种类型的参数,我如何才能让方法对话框只允许两种类型的参数和字符串?
你不能在 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)动态调用。必须在编译时知道是否要调用该函数Int的String重载或重载。它也与使用Any.
| 归档时间: |
|
| 查看次数: |
7479 次 |
| 最近记录: |