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.

  • ¿Se puede convertir un campo en una versión no nula de sí mismo?
  • kotlin inversa boolean seguro de casting
  • Kotlin con si no es nulo
  • Afirmación no nula de Kotlin en nulo
  • ¿Qué es el doble explosión de Kotlin?
  • Kotlin comtesting null dos veces en caso de que no
  • ¿Hay alguna manera de crear una matriz no nula a partir de un range?
  • Cómo implementar lateinit correctamente con objects de class personalizados para usar en onCreate () en Android evitando el error 'Property getter or setter expected'
  • function kotlin devuelve nulo
  • ¿Por qué la llamada insegura .run () funciona bien en un valor nulo en Kotlin?
  • Kotlin Advertencia de security nula Tokens inesperados (uso; para separar expresiones en la misma línea)