Yo uso when con mayúsculas y minúsculas como se menciona en el código a continuación. Es necesario para mí en la reflexión donde verifico el tipo de propiedad / campo y establezco o valor de conversión en consecuencia. En este ejemplo, el tipo de propiedad Double? no coincide con el caso Double::class.java. Si cambio el tipo de propiedad a Double sin ?, todo funciona como se esperaba. En este caso, ¿cómo resuelvo esto para las propiedades anulables declaradas con ?

     valueToSet = when(member?.getter?.returnType?.javaType) {
                Date::class.java -> {                    
                    DateUtil.asDate(LocalDateTime.parse(value))
                }

                Integer::class.java -> value.toInt()               
                Double::class.java -> value.toDouble()

                else ->value.toString();

            }
0
Ashok Krishnamoorthy 24 abr. 2020 a las 13:43

2 respuestas

La mejor respuesta

javaType le ofrece una instancia Type, no una instancia Java Class. Use classifier en su lugar y compare con las KClasses. Puede obtener returnType directamente desde KProperty sin pasar por el getter.

valueToSet = when(member?.returnType?.classifier) {
    Date::class -> {
        DateUtil.asDate(LocalDateTime.parse(value))
    }

    Integer::class -> value.toInt()
    Double::class -> value.toDouble()

    else -> value.toString();
}
2
Tenfour04 24 abr. 2020 a las 13:27

Double? corresponde a java.lang.Double, Double a double. Compare con ambos tipos, por ejemplo:

Double::class.java, java.lang.Double::class.java -> value.toDouble()

O separe si quiere tratarlos de manera diferente.

(Los cambios sugeridos por Tenfour04 también son una buena idea).

1
Alexey Romanov 25 abr. 2020 a las 12:00