@kotlin_lang

Страница 889 из 982
Andrey
25.09.2018
12:55:22
да я проверяю именно !=0, но задался вопросом почему не могу сделать >
Ну потому, что для null логичным образом можно определить, эквивалентен он чему-то, или нет, а вот сравнить его на больше/меньше уже не получится. Может быть null > 0 или null < Int.MIN_VALUE ??

Если у нас для некоторого набора non null значений есть отношение порядка, то не понятно, как его расширить, чтобы оно null тоже включало. Это если математически про больше/меньше.

Maxim
25.09.2018
12:58:52
не уверен что null == 0 это выглядит логично, для меня это странная конструкция
ну null это отсутствие объекта, 0 - объект, кажется весьма логичным

Google
Алексей
25.09.2018
13:00:56
А может кто-нибудь подсказать, есть ли аналог семафоров в котлиновских корутинах?

Vladimir
25.09.2018
13:00:57
не уверен что null == 0 это выглядит логично, для меня это странная конструкция
В таком виде это странное выражение только потому, что оно очевидно равно false. Но фишка в том, что вместо null может быть другое значение val size: Int? = ... size == 0

I
25.09.2018
13:02:26
ну null это отсутствие объекта, 0 - объект, кажется весьма логичным
в доке написано, что это автоматически трансформируется в a === null, то есть равенство ссылок, тогда это логично

из доки: "Заметьте, что в явном сравнении с null для оптимизации нет смысла: a == null будет автоматически транслироваться в a === null"

Oleg
25.09.2018
13:05:29
Добрый день! Помогите разобраться, пожалуйста, со следующим кодом. https://pastebin.com/VcG3SnQF Дело в том, что условия на строках 6 и 9 скомпилируются, а условие на 12 строке нет. Почему на 9 строке компилируется, а на 12 нет?

balolam
25.09.2018
13:07:02
У вас в IDE будет детально написано

Andrey
25.09.2018
13:09:08
не уверен что null == 0 это выглядит логично, для меня это странная конструкция
Если у нас есть набор non null значений, для которых определено отношение эквивалентности, то приняв, что null эквивалентен только себе и ничему более, мы расширяем исходное отношение с тем, чтобы оно включало null.

Так что всё логично.

Vladimir
25.09.2018
13:09:52
Добрый день! Помогите разобраться, пожалуйста, со следующим кодом. https://pastebin.com/VcG3SnQF Дело в том, что условия на строках 6 и 9 скомпилируются, а условие на 12 строке нет. Почему на 9 строке компилируется, а на 12 нет?
В youtrack хватает тикетов на подобные случаи, может, это один из них. Возможно, в 1.3 поведение будет ближе к ожидаемому (ничего не должно компилиться, компилятор вполне мог бы догадаться, что везде false).

Andrey
25.09.2018
13:23:32
Там написано, что всё со всем должно сравниваться на равенство.

Google
Oleg
25.09.2018
13:26:11
Andrey
25.09.2018
13:39:28
Добрый день! Помогите разобраться, пожалуйста, со следующим кодом. https://pastebin.com/VcG3SnQF Дело в том, что условия на строках 6 и 9 скомпилируются, а условие на 12 строке нет. Почему на 9 строке компилируется, а на 12 нет?
Как-то проифано в компиляторе, что при сравнении open классов и интерфейсов работает тупо Any.equals, а при сравнении значений final классов, компилятор проверяет что у них типы совпадают.

Зачем так - хз. Надо у создателей языка спрашивать. Почему это не задокументировано в Javadoc к Any.equals - тоже хз.

Konstantine
25.09.2018
13:43:45
Странно. Жил с полной уверенностью, что у наллабл коллекций есть всякие методы аля isNullOrEmpty на манер строк. :(

Vladimir
25.09.2018
13:55:46
Ну по тому, что написано в kotlin.Any для equals, я бы ожидал, что всё должно скомпилиться.
Для equals в Any описан контракт, по которому такое сравнение не может дать true, учитывая реализацию equals у Enum. Реализация в SimpleClass, конечно, может вести себя иначе, но язык с safety в приоритете не должен позволять делать такое (в идеальном мире).

Алексей
25.09.2018
13:57:27
Куда/к кому можно обратиться за кодревью одного класса?

Vladimir
25.09.2018
13:57:37
Зачем так - хз. Надо у создателей языка спрашивать. Почему это не задокументировано в Javadoc к Any.equals - тоже хз.
Проще/быстрее, вероятно. А не задокументировано, потому что может меняться с каждым релизом. И ломать кривой код - это вполне нормально, аналога JLS всё равно нет.

Anton
25.09.2018
13:57:37
Кидай))

Алексей
25.09.2018
13:57:37
Котлиновского

Anton
25.09.2018
13:57:45
На гист

Алексей
25.09.2018
13:57:58
https://gist.github.com/InsanusMokrassar/0720b26e2df7584e1121ba9df7aff7b9

Vladimir
25.09.2018
14:00:24
Проще/быстрее, вероятно. А не задокументировано, потому что может меняться с каждым релизом. И ломать кривой код - это вполне нормально, аналога JLS всё равно нет.
Про JLS ошибся, есть https://github.com/JetBrains/kotlin-spec/blob/master/kotlin-spec.asc Но я там не вижу описания того, что можно сравнивать, а что нет.

Andrey
25.09.2018
14:00:32
Для equals в Any описан контракт, по которому такое сравнение не может дать true, учитывая реализацию equals у Enum. Реализация в SimpleClass, конечно, может вести себя иначе, но язык с safety в приоритете не должен позволять делать такое (в идеальном мире).
Kotlin - язык с Safety в приоритете? Ну ну. Язык с safety в приоритете не должен декларировать equals на уровне top типа в иерархии. Какой смысл имеет сравнение на равенство двух функций, например? Как вообще произвольные объекты сравнивать на равенство друг с другом? Это не имеет смысла => должен быть некий интерфейс, декларирующий, что его реализации можно сравнивать на равенство, по аналогии с Comparable для отношения порядка.

То, что сейчас творится с проифыванием в компиляторе - костыли поверх наследия, пришедшего из Java Object

Andrey
25.09.2018
14:04:02
Мне кажется, просто это не в приоритете, а в будущем будет покрываться куда больше случаев
Ну интересно посмотреть, как будет развиваться компилятор проверх кривого наследия, притянутого в систему типов. Мне кажется, то ещё зрелище будет.

Andrey
25.09.2018
14:06:07
интересно, почему этот интерфейс не сделали, звучит и правда сверхлогично
Потому, что это пришло из Java, притом с тех времён, когда не было дженериков в Java

Google
Vladimir
25.09.2018
14:07:04
Кстати, приведённый пример в 1.3-RC работает так же, как раньше ?‍♂️ Ну, в другой раз

Maxim
25.09.2018
14:07:26
Потому, что это пришло из Java, притом с тех времён, когда не было дженериков в Java
так а что мешало в котлине сделать этот самый интерфейс?)

Andrew
25.09.2018
14:09:21
так а что мешало в котлине сделать этот самый интерфейс?)
А как классы, не реализующие этот интерфейс, в джаву отдавать?

Vladimir
25.09.2018
14:09:30
так а что мешало в котлине сделать этот самый интерфейс?)
Заявленный 100% интероп, наверное) В ранних версиях например не было platform types, просто всё из Java считалось nullable. Но отказались от этого. Так же и здесь - как минимум было бы очень много боли при вызове Java-кода.

Maxim
25.09.2018
14:11:33
Andrew
25.09.2018
14:11:50
в java что хочешь с ними делать можно
В том числе вызывать equals, который на них не определён?

Andrey
25.09.2018
14:12:26
так а что мешало в котлине сделать этот самый интерфейс?)
А как быть с Java объектами, при сравнении их в Kotlin? А что делать с Kotlin объектами, не реализующими интерфейс equals, когда ими пользуются из Java?

Алексей
25.09.2018
14:13:31
@antonkazakov вы не смотрели гист?

Vladimir
25.09.2018
14:14:28
Было бы что-нибудь такое: Java: List<String> Kotlin: (Mutable)List<String!|Eq!>!|Eq!

Andrey
25.09.2018
14:14:54
Java обьекты с переопределенным equals считать наследующими этот интерфейс
Это уже Go напоминает. Реализовал методы - значит реализовал интерфейс.

Vladimir
25.09.2018
14:15:02
Было бы что-нибудь такое: Java: List<String> Kotlin: (Mutable)List<String!|Eq!>!|Eq!
Плохой пример, надо заменить String на кастомный класс

Mikhail
25.09.2018
14:15:10
мы ведь про интероп говорим

Maxim
25.09.2018
14:15:31
А как быть с Java объектами, при сравнении их в Kotlin? А что делать с Kotlin объектами, не реализующими интерфейс equals, когда ими пользуются из Java?
хм, ну да, ответа на первый вопрос у меня нет, но считать объекты из java наследниками по дефолту? на второй вопрос - используем дефолтный equals

Andrew
25.09.2018
14:15:50
Было бы что-нибудь такое: Java: List<String> Kotlin: (Mutable)List<String!|Eq!>!|Eq!
Выглядит мило и очевидно, особенно для языка, где нету ни типов-сумм, ни структурного полиморфизма (я понимаю, что речь исключительно о границе на интеропе, но всё же). Напомните, пожалуйста, какой профит?

Vladimir
25.09.2018
14:17:06
Andrey
25.09.2018
14:17:21
хм, ну да, ответа на первый вопрос у меня нет, но считать объекты из java наследниками по дефолту? на второй вопрос - используем дефолтный equals
А какой Equals<T> реализуют Java классы? Что вместо T в общем случае? Если предположить существование Equals интерфейса, он должен быть дженерик, как и Comparable.

Примерно интерфейс должен быть таким: interface Equals<T> { fun eq(other: T): Boolean fun hc(): Int } Вот где брать T для Java объектов - загадка.

Google
Руслан
25.09.2018
14:20:37
https://gist.github.com/InsanusMokrassar/0720b26e2df7584e1121ba9df7aff7b9
Я вижу корутины и synchronized - наверняка они тебе там не нужны. Есть mutex, есть AtomicInteger

Sergey
25.09.2018
14:21:11
https://gist.github.com/InsanusMokrassar/0720b26e2df7584e1121ba9df7aff7b9
семафору на каналах как бы делать надо

Andrey
25.09.2018
14:22:06
В Java это Any?
По факту - да, но тогда для всех Java объектов мы теряем type safety, декларированное интерфейсом. Опять всё со всем можно сравнивать, а тогда зачем нам интерфейс?

Admin
ERROR: S client not available

Andrey
25.09.2018
14:24:24
Потому и нет интерфейса, вместе него type safety для ==, прибитый костылями в компиляторе, там где получилось (для final классов)

Алексей
25.09.2018
14:25:43
семафору на каналах как бы делать надо
Ок, посмотрю, как на каналах его сделать

Была подобная мысль, но я пока что немного плаваю в терминологии и понимании того, как корутины на самом деле устроены

Andrew
25.09.2018
14:26:46
Всё как обычно: Java - это unsafe по определению. Безопасность только в котлиновском коде.
Дык эцсамое, нету такого "обычно" в котлине — можно обезопасить себя, принимая оттуда всё как nullable, и ничего небезопасного не будет.

Aleksandr
25.09.2018
14:29:17
парни подскажите, никак не могу понять, как вот это val mySharedViewModel : MySharedViewModel by sharedViewModel() записать на джаве?

Vladimir
25.09.2018
14:29:22
Потому и нет интерфейса, вместе него type safety для ==, прибитый костылями в компиляторе, там где получилось (для final классов)
Ну как прибитый... https://youtrack.jetbrains.com/issue/KT-22043 Сравнение енумов явно не самая сильная сторона kotlinc

Aleksandr
25.09.2018
14:30:45
kotlin.Lazy<T>

это koin

Andrew
25.09.2018
14:32:47
kotlin.Lazy<T>
Ну тогда private MySharedViewModel _mySharedViewModel = null; public MySharedViewModel getMySharedViewModel() { if(_mySharedViewModel == null) { _mySharedViewModel = sharedViewModel(); } return _mySharedViewModel; } (это топорный и не потокобезопасный вариант)

Руслан
25.09.2018
14:33:21
парни подскажите, никак не могу понять, как вот это val mySharedViewModel : MySharedViewModel by sharedViewModel() записать на джаве?
Шаг 1. Разобраться как работают https://kotlinlang.org/docs/reference/delegated-properties.html Шаг 2. Посмотреть на реализацию того что делает sharedViewModel Вот и все

Andrew
25.09.2018
14:34:26
Ну допустим. А что с этим делать? var list = java.util.Collections.emptyList<Any>() list.add(1)
Читать джавадоки, в которых указано, что все модифицирующие методы кидают исключения?

Google
Andrew
25.09.2018
14:35:01
Как будто в котлине такой же код нельзя написать.

Vladimir
25.09.2018
14:36:52
Читать джавадоки, в которых указано, что все модифицирующие методы кидают исключения?
То же самое можно сказать про nullability, только тут безопасностью и не пахнет.

Alexander
25.09.2018
17:09:14
Здраствуйте, товарищи. Хочу заставить компилятор Kotlin (или IntelliJ) ругать меня за то, что я бросаю исключение, которое не указано в аннотации @Throws либо не ловлю исключение, которое бросает тот или иной метод. Короче говоря, хочу как в Java: получать по рукам за проверяемые исключения, которые не обрабатываются. Был ли у кого-то такой опыт? Я погуглил, внимательно посмотрел настройки Inspections в IntelliJ, но ничего не нашел.

Sealed-классы не совсем подходят, потому что я хочу обрабатывать 100500 исключений исключительно внизу try, в одном месте

Quantum Harmonizer
25.09.2018
17:13:49
зачем нулабельный?
Не-нуллабельный не боксится, если не присваивать его в Any/Number/etc

Руслан
25.09.2018
17:19:38
Sealed-классы не совсем подходят, потому что я хочу обрабатывать 100500 исключений исключительно внизу try, в одном месте
В Kotlin нету cheked эксепшнов, и @Throws нужен лишь для интеропа с джавой. В интренете можно найти кучу объяснений почему это так. Если по каким-то причинам хочется странного, можно посмотреть вот сюда https://arrow-kt.io/docs/patterns/error_handling/

Alexander
25.09.2018
17:24:40
В Kotlin нету cheked эксепшнов, и @Throws нужен лишь для интеропа с джавой. В интренете можно найти кучу объяснений почему это так. Если по каким-то причинам хочется странного, можно посмотреть вот сюда https://arrow-kt.io/docs/patterns/error_handling/
Я знаю, что там нет проверяемых исключений. Да, хочется странного, но материал по ссылке технически не решает описанную мною задачу. В любом случае спасибо

Alexander
25.09.2018
17:40:52
Таки релизнули: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html и http://jdk.java.net/11

Igor
25.09.2018
17:42:02
Что, обновили лицензию (теперь все платно) ? укатываемся openjdk от redhat/azule

Alexander
25.09.2018
17:43:15
Чего-то я не вижу, чтобы все было платно. Платная вроде только поддержка старых версий

Да, так и есть

Страдает только кровавый ынтырпрайз

Mikhail
25.09.2018
17:44:18
Да, или JdbcConverter & SqliteConverter, например
Есть джист? Мне кажется, что вариант дженерик в дженерике должен работать, но может я чего-то не знаю

Igor
25.09.2018
17:47:27
Да, так и есть
Ну с oracle jdk большие проблемы с установкой, а в openjdk вроде не будет long-support вообще (только полу-годовые релизы).

Alexander
25.09.2018
17:48:33
Ну с oracle jdk большие проблемы с установкой, а в openjdk вроде не будет long-support вообще (только полу-годовые релизы).
Это у кого проблемы? У меня наоборот если что (Windows). Openjdk в виде зипа идет, для которого еще надо все пути прописывать.

Страница 889 из 982