Obtener error de instancia en kotlin: conversión inteligente a 'tipo' es imposible

He convertido el file java a kotlin usando el convertidor de files incorporado de android studio. Muestra el siguiente error

[SMARTCAST_IMPOSSIBLE] Smart Cast para 'ReminderRequester' es imposible, porque 'ReminderRequester' es una propiedad mutable que podría haberse cambiado en este momento

Mi fragment de código es el siguiente.

private var sReminderInstance: ReminderRequester? = null val instance: ReminderRequester get() { if (sReminderInstance == null) { sReminderInstance = ReminderRequester() } return sReminderInstance; // ERROR: Smart cast to 'ReminderRequester' is impossible, because 'ReminderRequester' is a mutable property that could have been changed by this time } 

He verificado un tipo de pregunta similar, pero no puedo entenderla correctamente.

¿Qué significa el error anterior y cómo solucionarlo?

El error que está viendo es porque ReminderRequester no es lo mismo que ReminderRequester? . ¡Usando sReminderInstance!! en cierto sentido, está lanzando un object que admite nulos a un object que no admite nulos, lo que garantiza al comstackdor que usted sabe que nunca será nulo (pero podría estar equivocado).

… Lanzamiento inteligente a 'ReminderRequester' es imposible, …

Este error ocurre en la statement de return , y si está utilizando IntelliJ IDEA, hay un indicador rojo debajo de sReminderInstance . El post de error es débil, pero significa que porque está activando sReminderInstance desde una function ( get() ) que tiene un tipo de devolución de ReminderRequester (un tipo que no sReminderInstance ), el comstackdor debe convertir la variable devuelta en ReminderRequester . Pero, como dije, sReminderInstance no es un ReminderRequester (es un ReminderRequester? decir, un tipo anulable).

Verá este error mucho en el código Java convertido. Donde sea que esté acostumbrado a manejar variables posiblemente nulas, a menudo se convierten en types anulables. A veces, solo se verifica si es nulo antes de usarlo como no nulo. Eso se llama un "elenco inteligente". Otras veces, el comstackdor considera que el enhebrado puede vencer al elenco inteligente y lo desautoriza (en cuyo caso puede usar el !! cuando esté seguro de que el enhebrado no será un problema).

En resumen,

¿Qué significa el error anterior y cómo solucionarlo?

Significa que el comstackdor intentó un "lanzamiento inteligente". "Smart Cast" es la terminología para tratar de convertir un tipo que admite nulos en su equivalente no anulable. Y el reparto inteligente no siempre estará permitido, aunque usted verificó si la variable era nula. Para arreglarlo, ¡por lo general lo aplicarás !! a la variable que se está emitiendo

2 soluciones

1) Forzar el tipo de devolución para que tenga el mismo tipo que la propiedad

 return sReminderInstance!!; 

2) Cambiar el tipo de propiedad para que coincida con el tipo de devolución

 val instance: ReminderRequester? 
  • Thead.join matando hilo stream java (kotlin)
  • Cadena a bitmap en Kotlin
  • Kotlin Equivalente nativo de System.exit (-1)
  • C ++ Enum equivalente en Kotlin
  • Error al intentar crear una instancia de una class Kotlin de Java
  • ¿Cómo inicializo un campo final en Kotlin?
  • ¿Es posible desestructurar las classs de datos 'instancia en class'?
  • Cómo implementar una function de Kotlin a una vista
  • Cómo acceder a los miembros de un object interno en Kotlin
  • ¿Por qué String dividir con una cadena de expresiones regulares en Kotlin no es lo mismo con Java?
  • Kotlin: cómo acceder a Attrs para una vista personalizada