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? 
  • Kotlin coroutines CalledFromWrongThreadException
  • Float es un campo no válido para la comparación de Realm
  • Delegación de propiedad horneada por map mutable
  • Spring Cache de arranque no es compatible con Kotlin?
  • El comstackdor de Kotlin no puede deducir que la variable no puede contener nulos en el ciclo do-while
  • Kotlin y TornadoFX: ¿une una propiedad observable a una function de recostackción?
  • Crear una instancia de una cadena?
  • Kotlin si la instrucción se ejecuta incluso cuando es falsa
  • reflexión kotlin get list de campos
  • Debería hashCode () devolver el ID único de un object
  • ¿Hay alguna manera de filtrar nulo Any? valores en Kotlin Map?