Size: a a a

Kotlin Community

2020 March 10

BV

Boris Vanin in Kotlin Community
Это немного нелогично, потому что сумма интов как бы на выходе лонг всё равно должна давать
источник

IS

Ivan Sablin in Kotlin Community
Как кажется нашел баг в инлайн классах. В данном случае Millis это инлайн класс. Так вот при сборке получаю
Caused by: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Couldn't transform method node
источник

IS

Ivan Sablin in Kotlin Community
Millis это имплементация интерфейса TimeUnit. Если возвращаемый тип указать как TimeUnit, то все собирается успешно. Мб кто сталкивался?
источник

IS

Ivan Sablin in Kotlin Community
Версия кстати 1.3.70
источник

М

Михаил in Kotlin Community
Ivan Sablin
Millis это имплементация интерфейса TimeUnit. Если возвращаемый тип указать как TimeUnit, то все собирается успешно. Мб кто сталкивался?
инлайн классы не могут наследоваться если правильно помню
источник

IS

Ivan Sablin in Kotlin Community
источник

М

Михаил in Kotlin Community
А если убрать TimeUnit?
источник

IS

Ivan Sablin in Kotlin Community
а зачем? тут вся логика завязана просто на этом наследовании
источник

BV

Boris Vanin in Kotlin Community
Михаил
инлайн классы не могут наследоваться если правильно помню
Наследоваться они не могут, но могут имплементировать интерфейсы
источник

М

Михаил in Kotlin Community
Ivan Sablin
а зачем? тут вся логика завязана просто на этом наследовании
это самописный TimeUnit?
источник

IS

Ivan Sablin in Kotlin Community
Михаил
это самописный TimeUnit?
да
источник

AL

Alexander Levin in Kotlin Community
Ivan Sablin
а зачем? тут вся логика завязана просто на этом наследовании
Насколько я помню, если придётся передавать абстрактно TimeUnit, то будет боксинг, которого обычно хочется избежать с инлайн классами.

Решение проблемы - можно примерно воспользоваться дизайном kotlin.time.Duration (ну или просто заюзать). Он экспериментальный ещё, но идея похожа - инлайн класс для хранения интервала времени.
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Levin
Насколько я помню, если придётся передавать абстрактно TimeUnit, то будет боксинг, которого обычно хочется избежать с инлайн классами.

Решение проблемы - можно примерно воспользоваться дизайном kotlin.time.Duration (ну или просто заюзать). Он экспериментальный ещё, но идея похожа - инлайн класс для хранения интервала времени.
А как это поможет при взаимодействии с API, который не принимает инлайн-класс Duration?
источник

VP

Vladimir Petrakovich in Kotlin Community
Мне кажется, вся суть возможности реализовывать интерфейсы в том, что его можно при необходимости передать туда, где принимается интерфейс, а не конкретный инлайн-класс
источник

VP

Vladimir Petrakovich in Kotlin Community
При этом не надо конвертировать значение руками
источник

IS

Ivan Sablin in Kotlin Community
Vladimir Petrakovich
Мне кажется, вся суть возможности реализовывать интерфейсы в том, что его можно при необходимости передать туда, где принимается интерфейс, а не конкретный инлайн-класс
для этого и делал
источник

IS

Ivan Sablin in Kotlin Community
Vladimir Petrakovich
Мне кажется, вся суть возможности реализовывать интерфейсы в том, что его можно при необходимости передать туда, где принимается интерфейс, а не конкретный инлайн-класс
для того чтобы удобно гонять из секунд в дни и делать с ними матем. операции
источник

VP

Vladimir Petrakovich in Kotlin Community
Ну и конечно же при любом вводе компилятор не должен бросаться backend internal error, надо заводить issue)
источник

IS

Ivan Sablin in Kotlin Community
да, я тоже думаю, что ничто иное, как баг
источник

AL

Alexander Levin in Kotlin Community
Vladimir Petrakovich
А как это поможет при взаимодействии с API, который не принимает инлайн-класс Duration?
Не, если боксинг не проблема, то окей. Просто зависит от того, какие ожидания

NB: на ошибку сначала не обратил внимания. Это в любом случае баг и надо ишью писать/лайкать если уже есть.
источник