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

时间:2019-02-12 15:42:08

标签: java kotlin

我在Java中有两种方法:

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

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

get(someInstance)

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

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

1 个答案:

答案 0 :(得分:0)

首先,在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)作为非可变参数重载)。因此,如果可以复制,建议您将其张贴在此处。

两个可能的解决方法:

  1. 试图改编Kotlin function overloading (varargs vs single parameter)中的技巧:

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

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

并从Kotlin调用它。