从kotlin调用java varargs方法
我有一个java函数:从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是必需的,但是参
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)
是正确的,不过我想补充一些意见
无法将Kotlinvararg
参数传递到需要另一个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)