Как конвертировать vararg в список? - PullRequest
2 голосов
/ 16 октября 2019

У меня есть функция с параметром vararg. Этот параметр vararg необходимо передать другой функции в виде списка.

Как преобразовать параметр vararg в список? listOf() дал мне ошибку.

fun insertMissingEntities(vararg entities: Entity) {
  val list = listOf(entities)
  passMissingEntities(list) // Type mismatch. 
                            // Required: List<Entity>
                            // Found: List<Array<out Entity>>
}

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

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

fun insertMissingEntities(vararg entities: Entity) {
  passMissingEntities(entities.asList())
}
2 голосов
/ 16 октября 2019

Параметр vararg нужно распространять с помощью оператора *.

fun insertMissingEntities(vararg entities: Entity) {
  val list = listOf(*entities)
  passMissingEntities(list)
}
0 голосов
/ 16 октября 2019

Koltin (varang a: Entity) ~ = Java (a: Entity ... a)

Что означает, что вы можете передать несколькопараметры типа Entity не весь массив / список

Когда мы вызываем функцию vararg, мы можем передавать аргументы один за другим, например, asList (1, 2, 3) или, еслиу нас уже есть массив и мы хотим передать его содержимое в функцию, мы используем оператор распространения. (префикс массива *):

    fun insertMissingEntities(vararg entities: Entity) {
      val list = listOf(entities)  // Here entities is already a list of entity so you are doing listOf(listOf(entity)).. Hence , the error

//passMissingEntities(list) -> WRONG// Type mismatch. 
                                    // Required: List<Entity>
                                    // Found: List<Array<out Entity>>


 passMissingEntities(entities) // Just pass the entities instead of converting it to list again
    }

Также читайте: https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs

...