从Kotlin调用通用Java varargs方法

问题描述 投票:2回答:2

我试图从Kotlin调用以下Java方法:

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

这种方法是Kafka Streams API的一部分。

我在the Kotlin docs之后尝试调用它的方法是定义一个扩展方法:

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作为参数,在传递具有相同签名(K, V) -> Boolean的Kotlin lambda时可以毫无问题地被调用。

有任何想法吗?我见过this similar question,但这里的东西似乎略有不同,我无法指出它。

kotlin apache-kafka-streams
2个回答
3
投票

不幸的是,SAM conversion不支持变长参数。你可以通过自己将(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())
}

0
投票

实际上你可以这样定义。

fun <in K, in V> KStream<K, V>.kbranch(vararg predicates: out Predicate<K, V>):
    Array<KStream<K, V>> = this.branch(*predicates)
© www.soinside.com 2019 - 2024. All rights reserved.