Kotlin 调用了错误的重载 Java 方法,该方法具有可变数量的参数



我在java中有两个方法:

Object get(A a)
Object get(A a, B... b)

当我尝试在 Kotlin 中调用第一个方法时

get(someInstance)

它始终使用空的第二个参数调用第二个方法。

在这种情况下,我如何从 Kotlin 调用第一个方法?

首先,在 Kotlin 中定义方法时不会发生这种情况:

class A
class B
fun f(a: A) { println("one") }
fun f(a: A, vararg rest: B) { println("many") }
fun main(args: Array<String>) {
    f(A())
}

打印one .搜索 https://youtrack.jetbrains.com/issues?q=kotlin%20vararg%20java 我找不到这个确切的问题(https://youtrack.jetbrains.com/issue/KT-11150 很接近,但它get(Object a)为非 vararg 重载(。因此,如果您可以复制它,我建议您将其发布在那里。

两种可能的解决方法:

  1. 尝试从 Kotlin 函数重载中改编一个技巧(varargs 与单个参数(:

    val a: A = ...
    a.let(::get)
    
  2. 在 Java 中定义一个包装器:

    Object getNonVararg(A a) { return get(a); } 
    

并从 Kotlin 调用它。

最新更新