允许一个参数使用不同类型,例如String和StringRes int的总和类型

时间:2018-12-01 19:26:22

标签: android kotlin

是否有任何适当的方法将参数声明为可以接受多种类型的联合类型,例如您可以将函数称为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个参数,应该少一些

2 个答案:

答案 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