代码之家  ›  专栏  ›  技术社区  ›  gavrie

从Kotlin调用通用Java varargs方法

  •  2
  • gavrie  · 技术社区  · 7 年前

    我试图从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 作为参数,在传递具有相同签名的Kotlin lambda时,可以调用而不会产生任何问题 (K, V) -> Boolean .

    有什么想法吗?我看到了 this similar question ,但这里有些地方似乎有细微的不同,我无法准确指出。

    2 回复  |  直到 7 年前
        1
  •  3
  •   miensol    7 年前

    不幸地 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())
    }
    
        2
  •  0
  •   Kaloglu    7 年前

    实际上你可以这样定义。

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