Size: a a a

2020 July 15

AE

Alexandr Emelyanov in KotlinLangRu
_OM_
IntelliJ предлагает заменить доступ к map с get на [] , в чем прикол? Кроме унификации доступа с другими коллекциями
идея всегда предлагает заменить на оператор, если это возможно
источник

YS

Yury Schkatula in KotlinLangRu
Quantum Harmonizer
хммм, а как они были сделаны на JVM?
возможно, через ref-обёртки? типа, указатель не поменялся - java счастлив, а контент под указателем уже другой
источник

QH

Quantum Harmonizer in KotlinLangRu
При чём здесь виртуальность?
Есть классы — ObjRef, IntRef и т. п. — через которые котлин позволяет мутировать захваченные в noinline-лямбду переменные, ровно то же можно провернуть с параметрами.
источник

BP

Bogdan Panchenko in KotlinLangRu
Quantum Harmonizer
При чём здесь виртуальность?
Есть классы — ObjRef, IntRef и т. п. — через которые котлин позволяет мутировать захваченные в noinline-лямбду переменные, ровно то же можно провернуть с параметрами.
Блин я чатов ошибся, я с основой спутал 😢 (тред вообще про другое)
источник
2020 July 16

АЕ

Алексей Ершов... in KotlinLangRu
Привет, котлинисты! Никак не могу докрутить у себя в голове generic-и.
Задача: есть сериализатор.
interface MessageSerializer<in T> where T : Message {
   fun serialize(message: T): String
}

Message - это sealed класс
Хочу сделать для сериализаторов фабрику, которая их по заданному Message будет производить:
fun getSerializer(message: Message): MessageSerializer
Как в этом методе правильно расставить дженерики?
источник

АЕ

Алексей Ершов... in KotlinLangRu
чтобы снаружи можно было сделать factory.getSerizliaer(message).serialize(message)
источник

QH

Quantum Harmonizer in KotlinLangRu
Алексей Ершов
Привет, котлинисты! Никак не могу докрутить у себя в голове generic-и.
Задача: есть сериализатор.
interface MessageSerializer<in T> where T : Message {
   fun serialize(message: T): String
}

Message - это sealed класс
Хочу сделать для сериализаторов фабрику, которая их по заданному Message будет производить:
fun getSerializer(message: Message): MessageSerializer
Как в этом методе правильно расставить дженерики?
fun <T : Message> getSerializer(message: T): MessageSerializer<T>
источник

АЕ

Алексей Ершов... in KotlinLangRu
Quantum Harmonizer
fun <T : Message> getSerializer(message: T): MessageSerializer<T>
тогда при попытке вернуть конкретный экземпляр он ругается, что тип не соответствует
источник

АЕ

Алексей Ершов... in KotlinLangRu
источник

QH

Quantum Harmonizer in KotlinLangRu
Алексей Ершов
тогда при попытке вернуть конкретный экземпляр он ругается, что тип не соответствует
Когда делаешь when (message) { is ..., я думаю, компилятор не уточняет тип T в этих ветках.
источник

АЕ

Алексей Ершов... in KotlinLangRu
О чём и речь) И что делать с этим?
источник

АЕ

Алексей Ершов... in KotlinLangRu
Unchecked cast везде делать?
источник

QH

Quantum Harmonizer in KotlinLangRu
Алексей Ершов
Unchecked cast везде делать?
Боюсь, что да. Можно ещё в основе спросить, @kotlin_lang, там разработчики языка есть.
источник

АЕ

Алексей Ершов... in KotlinLangRu
Спасибо за направление
источник

QH

Quantum Harmonizer in KotlinLangRu
Алексей Ершов
О чём и речь) И что делать с этим?
Речь о том, что когда message is Authorize, компилятор не связывает это с там, что T : Autgorize. И, кстати, правильно делает.
источник

АЕ

Алексей Ершов... in KotlinLangRu
Да, я это понимаю, поэтому и спрашиваю. Ощущение, что логчески это должно работать, просто я не понимаю, как компилятор убедить, что всё хорошо.
источник

QH

Quantum Harmonizer in KotlinLangRu
Можно вызвать getSerializer<Message>(someMsg), и компилятор со своими предосторожностями окажется прав.
источник

QH

Quantum Harmonizer in KotlinLangRu
Алексей Ершов
Да, я это понимаю, поэтому и спрашиваю. Ощущение, что логчески это должно работать, просто я не понимаю, как компилятор убедить, что всё хорошо.
Можно просто сделать метод serialize(message), без отдельной ступени get
источник

АЕ

Алексей Ершов... in KotlinLangRu
тогда этот get просто внутрь переместится
источник

QH

Quantum Harmonizer in KotlinLangRu
Алексей Ершов
тогда этот get просто внутрь переместится
Нет, нужно спечь get и serialize в один метод. Тогда всё компилируется и типобезопасно работает.
источник