我有一个Java to Kotlin转换器失败的例子,因为我没有将方法参数标记为可空。Java到Kotlin转换器和可空方法参数
示例:使用registerActivityLifecycleCallbacks
跟踪活动的生命周期:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityResumed(Activity activity) {}
// ... other overriden methods
});
粘贴此代码科特林结果:
registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle) {}
override fun onActivityStarted(activity: Activity) {}
override fun onActivityResumed(activity: Activity) {}
override fun onActivityPaused(activity: Activity) {}
// ... other overriden methods (all with non-nullable parameters)
})
的问题是,savedInstanceState
参数类型是Bundle
它应该是Bundle?
,因为它的价值可以是null
。
在这种情况下,当没有实例的状态创建一个Activity
我们会得到以下异常:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
注意,根本原因这可能是onActivityCreated documentation没有提到Bundle
可以为空而onCreate documentation也可以解释为什么简单onCreate
转换按预期工作:
// Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// Kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
我的问题是我们如何知道哪些论据应该是可空的以防止这类问题? @Nullable注释在这里没有帮助。
我想这支持你的论点:https://kotlinlang.org/docs/reference/java-interop。HTML#空性的注解。将尝试再次使用注释进行转换(以前不适用于我) –
是的,Kotlin假定Java代码默认情况下不为空,除非它具有注释。它使用Java代码的'!',比如'String!'来告诉你代码来自Java。 – Joshua