从kotlin调用java varargs方法

从kotlin调用java varargs方法,kotlin,Kotlin,我有一个java函数: public static void initialize(@NonNull Activity activity, Settings... settings) {} 我想从科特林打电话给它: fun initialize(activity: Activity, vararg settings: settings) = JavaClass.initialize(activity, settings) 但是它没有编译,告诉我存在类型不匹配,Settings是必需的,但是参

我有一个java函数:

public static void initialize(@NonNull Activity activity, Settings... settings) {}
我想从科特林打电话给它:

fun initialize(activity: Activity, vararg settings: settings) = JavaClass.initialize(activity, settings)
但是它没有编译,告诉我存在类型不匹配,
Settings
是必需的,但是参数是
kotlin.Array

我看到它正试图将它与signture匹配

public static void initialize(@NonNull Activity activity, Settings settings) {}
但是我想用

public static void initialize(@NonNull Activity activity, Settings[] settings) {}

应使用以下语法:

fun initialize(activity: Activity, vararg settings: settings) =
    JavaClass.initialize(activity, *settings)
是正确的,不过我想补充一些意见

无法将Kotlin
vararg
参数传递到需要另一个
vararg
的Java(或Kotlin)函数中的原因是编译器将
vararg
解析为
数组

因此,就好像您已将函数声明为如下所示(从函数的内部作用域的角度来看):

然而,在科特林,我们可以做到:

JavaClass.initialize(activity, *settings, myAdditionalSetting)
  • 第二个好处是提高了安全性。spread运算符编译为对
    Arrays.copyOf()
    的调用,这保证了扩展值的不变性。i这确保了被调用的函数不会损坏原始数组


  • i:虽然实际的类引用是不可变的,但它们引用的对象可能仍然是可变的。

    此外,这里还有一个关于varargs和spread操作符的文档引用:
    Settings[] settings = //...
    Setting myAdditionalSetting = new Setting();
    JavaClass.initialize(activity, settings, myAdditionalSetting); //Compiler Error 
    
    JavaClass.initialize(activity, *settings, myAdditionalSetting)