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? 
  • ¿Cómo puedo ejecutar la inspección del código de AndroidStudio en la terminal?
  • retryWhen () no llama a lo que está dentro de Observable.just ()
  • Cómo deserializar a los delegates de Kotlin en GSON
  • ¿Por qué el comstackdor de Scala me da un error al pasar una class sellada de Kotlin a un constructor?
  • IntelliJ (usando gradle): no se puede encontrar el complemento de Kotlin aunque esté instalado
  • Cómo hacer comprobaciones nulas con las funciones de extensión de Kotlin en una actividad de Android
  • ERROR: error.NonExistentClass Kotlin en proyecto de Dagger de varios modules
  • Room y Kotlin: get "Cada variable de vinculación en la consulta debe tener un parámetro de método coincidente".
  • JsonArray a la class de datos de Kotlin con Retrofit (se esperaba BEGIN_OBJECT pero era BEGIN_ARRAY)
  • ¿Cómo funciona la interpolación de cadenas en Kotlin?
  • Constructores para types de tipo tipado utilizando generics