Estoy quemando ciclos tratando de entender por qué recibo un error de conversión cuando sé con certeza que es una cadena.
¿Alguien más ha visto esto en Kotlin? (falla en la penúltima línea).
val stringValue = if (attributesMap[it] !is String) { // same as !(obj is String) gson.toJson(attributesMap[it]) } else if (attributesMap[it] == null) { "" } else { if (attributesMap[it] is String) logger.info("it's a string wth...${attributesMap[it]}") attributesMap[it] // <--- The stacktrace shows this line as the culprit, and the above "it's a string line" is printed out as well }Aquí está el error:
java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class java.lang.String (java.util.ArrayList and java.lang.String are in module java.base of loader 'bootstrap')Actualización 1: esto comenzó a suceder después de actualizar Kotlin 1.4.10 a 1.5.30. Además, la entrada en la que falla es una cadena que parece una matriz: ["elemento1", "elemento2"]
Supongo que el problema es que attributesMap[it] no es una propiedad en sí misma. En realidad, es una llamada de función attributesMap.get(it) . Es por eso que el compilador no puede emitirlo inteligentemente.
Además, no estoy seguro de su orden de declaraciones if . Si attributesMap[it] !is String es falso, attributesMap[it] == null definitivamente será falso.
Prueba este código, a ver si te funciona.
val value = attributes[it] // Store the value beforehand val stringValue = if(value == null) "" else if(value is String) value else gson.toJson(value) También puede reemplazar esta escalera if-else con una declaración when .