Kotlin 使用可变数量的参数调用错误的重载 java 方法

Pav*_*zov 6 java kotlin

我在java中有两种方法:

Object get(A a)
Object get(A a, B... b)
Run Code Online (Sandbox Code Playgroud)

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

get(someInstance)
Run Code Online (Sandbox Code Playgroud)

它总是使用空的第二个参数调用第二个方法。

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

Ale*_*nov 1

首先,当在 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())
}
Run Code Online (Sandbox Code Playgroud)

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

两种可能的解决方法:

  1. 尝试采用 Kotlin 函数重载的技巧(可变参数 vs 单参数)

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

    Object getNonVararg(A a) { return get(a); } 
    
    Run Code Online (Sandbox Code Playgroud)

并从 Kotlin 调用它。