Тип сравнения / совпадения в kotlin - PullRequest
0 голосов
/ 24 апреля 2020

Я использую when со случаями типа, как указано в коде ниже. Это необходимо для меня, когда я проверяю тип свойства / поля и соответственно устанавливаю или приводим значение. В этом примере тип свойства Double? не соответствует регистру Double::class.java. Если я изменю тип свойства на Double без ?, тогда все будет работать как положено. В этом случае, как мне решить эту проблему для обнуляемых свойств, объявленных с ?

     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();

            }

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

javaType дает вам экземпляр Type, а не экземпляр Java Class. Вместо этого используйте classifier и сравните с KClasses. Вы можете получить returnType непосредственно из KProperty без прохождения через геттер.

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

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

    else -> value.toString();
}
1 голос
/ 24 апреля 2020

Double? соответствует java.lang.Double, Double - double. Сравните с обоими типами, например:

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

или отдельно, если вы хотите относиться к ним по-разному.

(Изменения, предложенные Tenfour04, также являются хорошей идеей.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...