Conversor de Java a Kotlin y arguments de método nulable

Tuve un caso en el que el convertidor de Java a Kotlin me falló miserablemente al no marcar los arguments del método como anulables.

Ejemplo: seguimiento del ciclo de vida de la actividad usando 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 }); 

Pegando este código a los resultados de 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) }) 

El problema es que el tipo de argumento savedInstanceState es Bundle donde debería estar Bundle? porque su valor puede ser null .

En este caso, obtendremos la siguiente exception cuando se crea una Activity sin estado de instancia:

 java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState 

Tenga en count que la causa raíz de esto puede ser que la documentation de OnActivityCreated no menciona que Bundle puede ser nulo, mientras que la documentation de OnCreate puede explicar por onCreate conversión onCreate simple funciona como se espera:

 // 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) } 

Mi pregunta es ¿cómo sabemos qué arguments deben ser anulables para evitar ese tipo de problemas? La anotación @Nullable no ayuda aquí.

Si las annotations no ayudan, no creo que haya una manera de saber si un argumento es nulo o no.

En cuanto a su código publicado, creo que sé lo que está pasando:

La actividad onCreate IS está marcada como @Nullable :

 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { final AppCompatDelegate delegate = getDelegate(); delegate.installViewFactory(); delegate.onCreate(savedInstanceState); . . 

Si bien los methods de la interfaz ActivityLifecycleCallbacks no son : (Consulte Application.java )

 public interface ActivityLifecycleCallbacks { void onActivityCreated(Activity activity, Bundle savedInstanceState); void onActivityStarted(Activity activity); void onActivityResumed(Activity activity); void onActivityPaused(Activity activity); void onActivityStopped(Activity activity); void onActivitySaveInstanceState(Activity activity, Bundle outState); void onActivityDestroyed(Activity activity); } 

Así que aparentemente el traductor de Kotlin está procesando annotations, pero usando Non-Null como pnetworkingeterminado, lo cual en mi humilde opinión no es lo habitual, ya que tiene más sentido que los parameters no anotados se consideren Nullable . Sin embargo, puedo entender esa decisión para obligar a los desarrolladores a prestar atención al código traducido y decidir explícitamente si un parámetro es Nullable o no.

Por cierto, @NonNull count que hay varias annotations @NonNull y @Nullable (javax, android, jetbrains …) No me sorprendería si el traductor de Kotlin solo reconoce algunas de ellas (pero es solo una suposition)

También con respecto a su código, Java Lint debería haberle dado una advertencia sobre su onCreate anulado, diciendo que está anulando un método con parameters anotados y no los ha anotado.

  • Kotlin null-safety para properties de class
  • Kotlin .let {} nulo error de security supuestamente falso
  • function kotlin devuelve nulo
  • ¿Se puede convertir un campo en una versión no nula de sí mismo?
  • Afirmación no nula de Kotlin en nulo
  • ¿Hay alguna manera de crear una matriz no nula a partir de un range?
  • La mejor forma de comprobar null en kotlin?
  • Cómo implementar lateinit correctamente con objects de class personalizados para usar en onCreate () en Android evitando el error 'Property getter or setter expected'
  • ¿Qué es el doble explosión de Kotlin?
  • Combine security nula y assertNotNull
  • Kotlin Advertencia de security nula Tokens inesperados (uso; para separar expresiones en la misma línea)