Разрешить параметру принимать более одного типа в качестве входных данных, в то время как он более сфокусирован, чем «Любой» - PullRequest
0 голосов
/ 16 октября 2018

У меня есть метод, который принимает value, который должен иметь тип Boolean, Float, Int, Long или String.Есть ли способ заставить этот метод принимать эти типы только для value, а не принимать Any и обрабатывать неправильные значения, как я делал с оператором when()?

fun putValue(key: String, value: Any) {
        when (value) {
            is Boolean -> putBoolean(key, value)
            is Float -> putFloat(key, value)
            is Int -> putInt(key, value)
            is Long -> putLong(key, value)
            is String -> putString(key, value)
            null -> return
        }
    }

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

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

Шаги:

  1. Удалите текущую putValue функцию
  2. Переименуйте все существующие функции, специфичные для типа, с putXXX на putValue (все они будут иметь одинаковые имена и будут перегружены типом аргумента)
0 голосов
/ 16 октября 2018

Единственный общий интерфейс, который у них всех (самый дальний по иерархии наследования) - Comparable<T>.Таким образом, вы можете ограничить тип value следующим образом, используя Generics с верхней границей:

fun <T: Comparable<T>> putValue(key: String, value: T?) {

    when (value) {
        is Boolean -> println("Boolean")
        is Float ->  println("Float")
        is Int -> println("Int")
        is Long -> println("Long")
        is String -> println("String")
        null -> return
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...