Intereting Posts
Можем ли мы получить доступ к PropertyMetaData любого свойства в котлин? Приложение Android на Gradle: невозможно слить dex Как синтетически добавить активность в задний стек перед началом другого? Кинжал 2, вводящий представление модели активности в фрагмент Основной метод Kotlin Android не вызывается Как я могу создать «статический» метод для перечисления в Котильне? Kotlin падает на Android, когда выбранный вид элемента равен нулю Kotlin с JPA / Hibernate: без ленивой загрузки без `open`? Смарт-литье и сравнение внутри Когда выражение после «есть» проверка типа используя компиляцию "org.jetbrains.kotlin: kotlin-stdlib-jre7: $ kotlin_version" дать ошибку Упрощение кода, который является одинаковым удовольствием, за исключением подписи (varargs vs map) эквивалентный интерфейс java на kotlin Firebase не получает данные из метода onDataChange Статические функции Котлина: объект-компаньон, @JvmStatic @JvmField Spring Data JPA / Hibernate "Невозможно найти атрибут с заданным именем"

Вызов универсального метода Java varargs от Kotlin

Я пытаюсь вызвать следующий метод Java от Kotlin:

KStream<K, V>[] branch(final Predicate<? super K, ? super V>... predicates); 

Этот метод является частью API Kafka Streams .

То, как я пытался это назвать, следуя документам Котлина , заключалось в определении метода расширения:

 fun <K, V> KStream<K, V>.kbranch(vararg predicates: (K, V) -> Boolean): Array<KStream<K, V>> = this.branch(*predicates) 

Проблема в том, что он не компилируется. Я получаю следующую ошибку:

 Type mismatch: inferred type is Array<out (K, V) -> Boolean> but Array<(out) Predicate<in K!, in V!>!>! was expected 

Подобный KStream#filter , который принимает один Predicate в качестве аргумента, может быть вызван без какой-либо проблемы при передаче лямбда Kotlin с той же сигнатурой (K, V) -> Boolean .

Есть идеи? Я видел этот подобный вопрос , но что-то здесь кажется немного отличающимся, и я не могу его точно определить.

Solutions Collecting From Web of "Вызов универсального метода Java varargs от Kotlin"

К сожалению, преобразование SAM не поддерживается для аргументов переменной длины. Вы можете обойти это, хотя путем преобразования (K, V) -> Boolean в Predicate<K,V> себя так:

 fun <K, V> KStream<K, V>.kbranch(vararg predicates: (K, V) -> Boolean): Array<KStream<K, V>> { val arguments = predicates.map { Predicate { key: K, value: V -> it(key, value) } } return this.branch(*arguments.toTypedArray()) } 

На самом деле вы можете так сказать.

 fun <in K, in V> KStream<K, V>.kbranch(vararg predicates: out Predicate<K, V>): Array<KStream<K, V>> = this.branch(*predicates)