разрешить разные типы для одного параметра, такие как тип суммы String и StringRes int - PullRequest
0 голосов
/ 01 декабря 2018

Есть ли какой-либо правильный способ объявить параметр как тип объединения, который принимает несколько типов, например, вы можете вызвать функцию как 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 параметров, должно быть меньше

1 Ответ

0 голосов
/ 02 декабря 2018

Как правило, вы не можете сделать это в настоящее время.В большинстве случаев я бы просто создал надлежащие перегрузки для ваших функций.Альтернативой может быть абстрагирование типа с помощью пользовательского класса.

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))
}

Если хотите, вы можете использовать экспериментальные inline классы , которые были представлены в Kotlin 1.3.Просто сделай Text inline class тогда.Это снимет накладные расходы на выделение кучи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...