从 Kotlin 调用通用 Java 可变参数方法
Calling a generic Java varargs method from Kotlin
我正在尝试从 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 时可以毫无问题地调用。
有什么想法吗?我看过 ,但这里有些东西似乎有些不同,我无法确定。
不幸的是 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())
}
其实你可以这样定义。
fun <in K, in V> KStream<K, V>.kbranch(vararg predicates: out Predicate<K, V>):
Array<KStream<K, V>> = this.branch(*predicates)
我正在尝试从 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 时可以毫无问题地调用。
有什么想法吗?我看过
不幸的是 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())
}
其实你可以这样定义。
fun <in K, in V> KStream<K, V>.kbranch(vararg predicates: out Predicate<K, V>):
Array<KStream<K, V>> = this.branch(*predicates)