从 Kotlin 调用一个通用的 Java varargs 方法



我正在尝试从 Kotlin 调用以下 Java 方法:

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

此方法是 Kafka Streams API 的一部分。

按照 Kotlin 文档,我尝试调用它的方式是通过定义一个扩展方法:

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 lambda 时可以毫无问题地调用 (K, V) -> Boolean .

有什么想法吗?我见过这个类似的问题,但这里似乎有些微妙的不同,我无法确定它。

不幸的是,

可变长度参数不支持 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)

相关内容

  • 没有找到相关文章

最新更新