J'ai eu un cas dans lequel le convertisseur de Java en Kotlin m'a échoué lamentablement en ne marquant pas les arguments de méthode comme nullable.Convertisseur Java en Kotlin et arguments de méthode nullable
Exemple: cycle de vie de l'activité de suivi à l'aide 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
});
coller ce code aux résultats Kotlin:
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)
})
Le problème est que le type d'argument savedInstanceState
est Bundle
où il devrait être Bundle?
parce que sa valeur peut être null
.
Dans ce cas, nous obtiendrons l'exception suivante lorsqu'un Activity
est créé sans état d'instance:
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
Remarque, la cause de la racine à cela peut être que onActivityCreated documentationne mentionne pas que Bundle
peut être nul alors que onCreate documentation ne qui peut expliquer pourquoi fonctionne comme prévu la conversion simple 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)
}
Ma question est Comment savons-nous quels arguments devraient être valables pour prévenir ce genre de problèmes? L'annotation @Nullable n'aide pas ici.
Je suppose que cela supporte votre argument: https://kotlinlang.org/docs/reference/java-interop.html # nullability-annotations. Je vais essayer de convertir avec une annotation encore une fois (ne fonctionnait pas pour moi avant) –
Oui, Kotlin suppose que le code Java n'est pas nul par défaut à moins qu'il ne comporte une annotation. Il utilise '!' Pour le code Java, comme 'String! 'Pour vous dire que le code provient de Java. – Joshua