Java Kotlin:将数组作为vararg参数传递时参数类型不匹配

Java Kotlin:将数组作为vararg参数传递时参数类型不匹配,java,arrays,kotlin,arguments,variadic-functions,Java,Arrays,Kotlin,Arguments,Variadic Functions,我有一个简单的接口及其实现: interface Iface { fun doSomething(s: String) } class IfaceImpl : Iface { override fun doSomething(s: String) { println("Doing the job, s = $s") } } 此外,还有两个相同(至少我看不出区别)的调用处理程序,一个在Java中,一个在Kotlin中: public class Java

我有一个简单的接口及其实现:

interface Iface {
    fun doSomething(s: String)
}

class IfaceImpl : Iface {
    override fun doSomething(s: String) {
        println("Doing the job, s = $s")
    }
}
此外,还有两个相同(至少我看不出区别)的调用处理程序,一个在Java中,一个在Kotlin中:

public class JavaHandler implements InvocationHandler {
    private final Iface target;

    public JavaHandler(Iface target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Java handler works");
        return method.invoke(target, args);
    }
}

class KotlinHandler(private val target: Iface) : InvocationHandler {
    override fun invoke(proxy: Any?, method: Method?, args: Array<out Any>?): Any {
        println("Kotlin proxy works")
        return method!!.invoke(target, args)
    }
}
我可以通过调试器看到,在这两种情况下,
args
都由1个元素组成,它是一个
java.lang.Integer
实例

有趣的是,如果该方法有0个参数,则错误消息不同:

Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在这种情况下,
null
作为
args
参数传递(javadocs允许无参数调用)

我做错什么了吗?还是这是一只虫子

My build.gradle具有以下功能:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.61'
}

更新:在较新版本的Kotlin中,您可以使用
args.orEmpty()
而不是
args?:emptyArray()

TL;博士 您不能传递
args
,但需要使用
*(args?:emptyArray())
,因为不需要数组,而需要可变参数

有关更多信息,请参阅

我发现实际问题的方式 我查看了生成的字节码,对于Kotlin,我得到以下信息:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.61'
}
override-fun-invoke(代理:Any?、方法:method、args:Array获取一个
对象…

将我们的中介更改为获取
对象…
,我们将得到错误消息以及以下输出:

Invoking method with [[Ljava.lang.Object;@4b67cf4d]

显然,我们传递的不是
对象[]
,而是
对象[]
,这意味着类型不匹配!

更新:在Kotlin的较新版本中,您可以使用
args.orEmpty()
而不是
args?:emptyArray()

太长,读不下去了 您不能传递
args
,但需要使用
*(args?:emptyArray())
,因为不需要数组,而需要可变参数

有关更多信息,请参阅

我发现实际问题的方式 我查看了生成的字节码,对于Kotlin,我得到以下信息:

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.61'
}
override-fun-invoke(代理:Any?、方法:method、args:Array获取一个
对象…

将我们的中介更改为获取
对象…
,我们将得到错误消息以及以下输出:

Invoking method with [[Ljava.lang.Object;@4b67cf4d]

显然,我们传递的不是
对象[]
,而是
对象[][]
,这意味着类型不匹配!

我相信这应该是Kotlin编译器发出的警告-非常容易修复但很难检测我相信这应该是Kotlin编译器发出的警告-非常容易修复但很难检测我玩了一会儿,希望我能让
vararg args:Any?
正常工作-但它似乎是撤销的由于Java调用为
args
传递null导致IllegarArgumentException跳闸,所以可以启用。我玩了一会儿,希望能让
vararg args:Any?
正常工作,但由于Java调用为
args
传递null导致IllegarArgumentException跳闸,所以它似乎是可以撤消的。