【问题标题】:Calling a generic Java varargs method from Kotlin从 Kotlin 调用通用 Java 可变参数方法
【发布时间】:2018-01-01 07:46:46
【问题描述】:

我正在尝试从 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) -&gt; Boolean 相同签名的Kotlin lambda 时可以毫无问题地调用。

有什么想法吗?我见过this similar question,但这里的某些东西似乎有些微妙的不同,我无法确定它。

【问题讨论】:

    标签: kotlin apache-kafka-streams


    【解决方案1】:

    很遗憾,SAM conversion 不支持可变长度参数。您可以通过自己将(K, V) -&gt; Boolean 转换为Predicate&lt;K,V&gt; 来解决它,如下所示:

    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())
    }
    

    【讨论】:

    • 非常感谢,这正是我所需要的!
    【解决方案2】:

    其实你可以这样定义。

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

    【讨论】:

      猜你喜欢
      • 2023-02-15
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多