Котлин … в параметрах функции, например, из Java — setFilterById(длинные … идентификаторы)

#kotlin #variadic-functions #function-parameter

#kotlin #переменные-функции #функция-параметр

Вопрос:

Например, в классе Android DownloadManager есть функция, объявленная в Java как:

     private long[] mIds = null;

    public Query setFilterById(long... ids) {
        mIds = ids;
        return this;
    }
  

В Java я могу передать ему массив длинных значений, и он отлично работает. В Kotlin, когда я пытаюсь:

     val mEnqued = ArrayList<Long>()
    // collect download ids to mEnqued...
    query.setFilterById(mEnqued.toLongArray())
    // or try to pass an array of long created in any other way...
    // it will take: query.setFilterById(7L, 15L, 234L) - but it's useless
  

Компилятор Kotlin жалуется на «несоответствие типов: предполагаемый тип — LongArray, но ожидался Long»… Как еще я мог передать этой функции список или массив длинных значений идентификаторов? Я не могу ввести их непосредственно в исходный код, потому что заранее я понятия не имею, сколько их будет или каковы будут их значения? Kotlin кажется здесь очень ограниченным или «поврежденным мозгом»…

Комментарии:

1. Попробуйте оператор распространения query.setFilterById(*mEnqued.toLongArray())

2. Спасибо, Майкл, это действительно помогает. Пожалуйста, опубликуйте это как фактический ответ, если вы не возражаете, другим тоже будет легче найти. Хорошая статья, которая объясняет эти вещи proandroiddev.com /…

Ответ №1:

У Kotlin есть оператор распространения для доставки массива в виде списка отдельных параметров в vararg функцию:

 query.setFilterById(*mEnqued.toLongArray())
  

Смотрите также документацию Kotlin