Error de compilation de Kotlin en Android Studio en << intent.putExtra ("cadena", it.getString ("cadena") >>

No puedo entender qué pasa con el siguiente fragment de código. Me parece que getString necesariamente devuelve una cadena. ¡De hecho, funciona en las líneas de arriba! ¿Es esto un error?

fun loadExtraBundleIntoIntent(origIntent: Intent, resultIntent: Intent) { origIntent.extras?.let { if (it.getString("peerUid") != null) { resultIntent.putExtra("fragment", "ChatFragment") resultIntent.putExtra("peerUid", it.getString("peerUid")) } else if (it.getString("fragment") != null) { resultIntent.putExtra("fragment", it.getString("fragment")) } if (it.getString("action") != null) resultIntent.putExtra("action", it.getString("action")) } } 

Error en

 resultIntent.putExtra("fragment", it.getString("fragment")) 

Mensaje de error:

 Error:(80, 30) Overload resolution ambiguity: public open fun putExtra(p0: String!, p1: Bundle!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Parcelable!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Serializable!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array<(out) Parcelable!>!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array<(out) CharSequence!>!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Array<(out) String!>!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Boolean): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: BooleanArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Byte): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: ByteArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Char): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: CharArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: CharSequence!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Double): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: DoubleArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Float): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: FloatArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Int): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: IntArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Long): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: LongArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: Short): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: ShortArray!): Intent! defined in android.content.Intent public open fun putExtra(p0: String!, p1: String!): Intent! defined in android.content.Intent 

Captura de pantalla del error

Considera que el valor devuelto por it.getString ("fragment") es nulo y el valor nulo coincide con todas estas funciones putExtra .

eg: resultIntent.putExtra("fragment", null)

Bundle, Parcelable, Serializable, Parcelable, CharSequence, String, BooleanArray, ByteArray, CharArray, CharSequence, DoubleArray, FloatArray, IntArray, LongArray, ShortArray, String

todos estos parameters son objects y nulo se puede configurar en todos estos parameters: "Ambigüedad de resolución de sobrecarga. Todas estas funciones coinciden"

De alguna manera, el comstackdor está considerando que el valor "it" puede ser nulo después de 'else if' y esto no debería suceder porque es un tipo Bundle! no nulo. Creo que este es un error del comstackdor.

He probado con la siguiente versión de Kotlin para comstackr tu código:

  • 1.1.3 (lanzado el 23 de junio de 2017): error de compilation de kotlin.
  • 1.1.2 (lanzado el 25 de abril de 2017): error de compilation de kotlin.
  • 1.0.7 (lanzado el 15 de marzo de 2017): comstackr! ¡sin error!

Entonces, si usa la versión 1.0.7 , ¡funcionará! – Es difícil configurar esta versión en el estudio de Android. O puede usar otras opciones para forzar al comstackdor a evitar / corregir este problema, por ejemplo:

  • '!!' : it!!.getString("fragment")
  • lanzar a String : it.getString("fragment") as String
  • ?: "" : it.getString ("fragment")?: ""
  • etc …

Esto parece un error de compilation. Sin embargo, le sugiero que lo reescriba de forma que solo recupere cada valor del package, por lo que el comstackdor puede inferir que el segundo argumento putExtra () siempre es no nulo:

 fun loadExtraBundleIntoIntent(origIntent: Intent, resultIntent: Intent) { origIntent.extras?.let { val peerUid = it.getString("peerUid") if (peerUid != null) { resultIntent.putExtra("fragment", "ChatFragment") resultIntent.putExtra("peerUid", peerUid) } else it.getString("fragment")?.let { resultIntent.putExtra("fragment", it) } it.getString("action")?.let { resultIntent.putExtra("action", it) } } } 

Está poniendo múltiples extras con los mismos valores key. Aquí usa fragment como valor key aquí

  resultIntent.putExtra("fragment", "ChatFragment") 

y de nuevo aquí

 resultIntent.putExtra("fragment", it.getString("fragment")) 

Error tonto: no hay ninguna statement if { } else if { } en Kotlin! Solo existe if { } else { } .

Editar: estaba equivocado, hay un

de lo contrario si

en Kotlin.

No sé por qué no comstack.

  • Desliza para actualizar para actualizar los datos
  • Alcance de la variable definida en el encabezado de bucle for
  • java.util.logging.Logger en class probada
  • Kotlin "fuera" y "en" y generics - uso correcto
  • ¿Cómo dividir una cadena con un set de delimitadores y encontrar qué delimitador era? Kotlin
  • ¿Cómo establecer el atributo de peso de forma dinámica desde el código de Kotlin?
  • Intercambio de un nodo en Guava MutableValueGraph
  • Cómo realizar la initialization en varios pasos de val
  • Android / Kotlin Crash en Start 4.1.2 - ExceptionInInitializerError
  • Sirve favicon.ico y otros files estáticos con VertX
  • Deserializar un campo que puede ser uno de dos types de datos utilizando Moshi