是否有任何适当的方法将参数声明为可以接受多种类型的联合类型,例如您可以将函数称为showMessage(message = "foobar")
或showMessage(message = R.string.foobar)
类似
fun showMessage(message: String? OR Int? = null,
title: String? OR Int? = null
){
when (message)
is String -> ...
is Int -> ...
...
}
也许与任何人在一起?但是它应该给非字符串对象一个编译时错误。也许具有多种功能?但这将需要2 ^ n个函数用于n个参数,应该少一些
答案 0 :(得分:0)
通常,您当前无法执行此操作。在大多数情况下,我只会为您的函数创建适当的重载。另一种选择是通过自定义类抽象类型。
class Text(val value: String) {
constructor(intValue: Int) : this(intValue.toString())
}
fun showMessage(message: Text, title: Text) {
val msgText = message.value
val titleText = title.value
}
fun main(args: Array<String>) {
showMessage(Text(1), Text("2"))
showMessage(Text("1"), Text(2))
}
如果愿意,可以使用Kotlin 1.3引入的实验性inline
classes。然后将Text
设为inline class
。它将消除堆分配的开销。
答案 1 :(得分:-2)
您可以在Kotlin中进行智能投射:https://kotlinlang.org/docs/reference/typecasts.html#smart-casts
fun showMessage(message: Any, title: Any) {
when (message) {
is String -> when (title) {
is String -> println("String and String")
is Int -> println("String and Int")
}
is Int -> when (title) {
is String -> println("Int and String")
is Int -> println("Int and Int")
}
}
}
fun main(args: Array<String>) {
showMessage("a", "b")
showMessage("a", 0)
showMessage(0, "b")
showMessage(0, 0)
}
将打印:
String and String
String and Int
Int and String
Int and Int