首页 文章

从Kotlin调用通用Java varargs方法

提问于
浏览
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

当传递具有相同签名 (K, V) -> Boolean 的Kotlin lambda时,可以毫无问题地调用类似的 KStream#filter 方法,该方法接受单个 Predicate 作为参数 .

有任何想法吗?我见过this similar question,但这里似乎有些不同,我无法指出它 .

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)
    

相关问题