Почему Kotlin не поддерживает целые числа без знака?

Совсем недавно я столкнулся с ситуацией, когда целое число без знака было бы действительно полезным (например, любое отрицательное значение не имело бы смысла и т. Д.). Удивительно, но я обнаружил, что Kotlin не поддерживает целые числа без знака - и, похоже, нет ничего другого о том, почему (хотя я смотрел).

Я что-то упускаю?


person starbeamrainbowlabs    schedule 07.05.2018    source источник
comment
stackoverflow.com/questions/ 430346 /   -  person nhaarman    schedule 07.05.2018
comment
@nhaarman Как ответ Java связан с вопросом Kotlin?   -  person starbeamrainbowlabs    schedule 07.05.2018
comment
@starbeamrainbowlabs, ты только что сказал то, что, как мне кажется, ты сказал?   -  person Vivick    schedule 07.05.2018
comment
@Vivick Если вы имеете в виду тот факт, что я не совсем понимаю, как связаны Java и Kotlin, тогда да.   -  person starbeamrainbowlabs    schedule 07.05.2018
comment
Kotlin перенесен на Java, поэтому здесь нет реальной поддержки целых чисел без знака. Вы все еще можете проделать свой путь с Unsigned классом, но вы столкнетесь с несколькими проблемами.   -  person Vivick    schedule 07.05.2018
comment
@ Вивик А, понятно. Все это имеет смысл сейчас! И почему этот ответ актуален, и почему система сборки для Kotlin излишне сложна ...   -  person starbeamrainbowlabs    schedule 07.05.2018
comment
@Vivick, Kotlin НЕ конвертируется в исходный код Java. Он переведен в байт-код JVM (виртуальная машина Java). Не дезинформируйте людей.   -  person Serid    schedule 01.02.2019


Ответы (3)


Почему в Kotlin нет собственных неподписанных типов

Это связано с тем, что, как показывает этот вопрос, в Java нет встроенные беззнаковые типы.

При использовании в JVM Kotlin компилируется в байт-код Java, поэтому это ограничение в Java распространяется также и на Kotlin.

Обходные пути

Вы можете использовать служебные методы Integer и Long для работы со значениями как unsigned link, но при этом значения по-прежнему сохраняются как подписанные внутри.

Вы также можете написать служебный класс, который содержит значение и действует как беззнаковый тип int, но это может быть медленнее, чем использование описанного выше метода.

person jrtapsell    schedule 07.05.2018
comment
Я не понимаю, почему JVM диктует функциональность. Если вы можете написать код, имитирующий беззнаковый, то байт-код может сделать то же самое. Вы говорите, что код будет неэффективным, поэтому дизайнеры просто не сочли нужным его поддерживать? Не следует, это невозможно. Из этого может последовать, что оно того не стоит. - person Mitch; 29.01.2019

Неподписанные аналоги Byte, Short, Int и Long существуют в бета-версии, начиная с Kotlin 1.3, и являются стабильный с Kotlin 1.5:

Из документов:

kotlin.UByte: 8-разрядное целое число без знака, диапазон от 0 до 255
kotlin.UShort: 16-разрядное целое число без знака, диапазон от 0 до 65535
kotlin.UInt: 32-разрядное целое число без знака, диапазон от 0 до 2 ^ 32-1
kotlin.ULong: 64-битное целое число без знака, диапазон от 0 до 2 ^ 64-1

использование

// You can define unsigned types using literal suffixes
val uint = 42u 

// You can convert signed types to unsigned and vice versa via stdlib extensions:
val int = uint.toInt()
val uint = int.toUInt()
person Willi Mentzel    schedule 07.12.2018

Начиная с Kotlin 1.3 доступны беззнаковые типы, основанные на функции встроенных классов.

См. Раздел «Целочисленные типы без знака» в версии 1.3-M1: https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/

person gildor    schedule 06.09.2018