Intereting Posts
Kotlin .let {} null безопасность предположительно ложная ошибка Kotlin: как создать 2D-массив типа String Как использовать фрагменты с kotlin Скомпилированные файлы kt состоят из байт-кодов? Kotlin \ Java – Строка типа "$ 1" на номер Связывание данных: ObservableField со значением лямбда не компилируется Почему Котлин не требует попыток и уловки явно Невозможно посмотреть переменную Kotlin в студии Android Как использовать аннотацию Jackson JsonSubTypes в Kotlin Привязка данных к Android в подмодуле Стоимость переключения потоков в RxJava и операции копирования класса данных Kotlin Android Studio 3.0 "JUnit версии 3.8 или более поздней версии" Корда-расчет – алгоритм фазового плана Gradle 3.0.0 (в Android Studio 3.0) изменяет порядок последовательности задач (при компиляции с модулем Kotlin)? Автоматическое обновление версии библиотеки для проектов Gradle в настоящее время не поддерживается. Обновите файл build.gradle вручную.

Как превратить Any в Int в Kotlin

У меня есть атрибут в моей модели, описанной выше, что в некоторых случаях содержит Int.

var value: Any? 

Я знаю, что я могу это сделать, если я сначала передаю String, а затем Int

 value.toString().toInt() // works 

Есть ли способ сделать это, пропустив кастинг в строку? Когда я пытаюсь привести непосредственно в Int, я получаю эту ошибку

 FATAL EXCEPTION: main Process: com.pablo.test, PID: 5033 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 

Solutions Collecting From Web of "Как превратить Any в Int в Kotlin"

Проблема в том, что вы пытались напрямую использовать String в Int со value as Int .

Это не работает, потому что, как указывает вам исключение, value содержит строку, а строка не может быть принудительно введена в Int. Тот факт, что эта String представляет целое число, не имеет значения, поскольку его необходимо проанализировать в Int. Это то, что toInt() метод toInt() .

Причина, по которой вы должны toInt() на String в первую очередь, состоит в том, что toInt() является методом расширения в String, а value имеет тип Any? , Это означает, что вы не можете вызвать toInt() непосредственно по value потому что он не знает, что он содержит строку во время компиляции, даже несмотря на то, что она выполняется во время выполнения. Если вы хотите пропустить этот шаг, вы также можете использовать интеллектуальные приведения, сначала проверив тип:

 if (value is String) { value.toInt() } 

Вы можете найти более подробную информацию о умных трансляциях и других методах Kotlin: https://kotlinlang.org/docs/reference/typecasts.html#smart-casts

Это также может указывать на основную проблему проектирования. Вы ожидаете, что это иногда будет содержать Int, но, как мы видим здесь, все, что устанавливает это значение в вашей модели, устанавливает его в String, содержащее это число. Вы ожидаете, что это значение действительно сможет содержать много разных типов, или вы ожидаете только Int и String? Если последнее, то, возможно, было бы лучшим дизайнерским решением сделать это как String, а не Any? , Это предотвратит предоставление непредвиденных / необработанных типов и сделает модель менее двусмысленной для всех, кто ее смотрит или использует.