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跳闸,所以它似乎是可以撤消的。