@kotlin_lang

Страница 737 из 982
Alexander
04.07.2018
10:12:44
Надо делать проверку на наследование а не на совпадение

Костя
04.07.2018
10:12:50
то есть он понимает что это лист и из каких элементов

Alexander
04.07.2018
10:13:07
Котлин же подменяет типы списков на свои

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

Google
Костя
04.07.2018
10:13:44
кстати, да

Alexander
04.07.2018
10:14:01
Можно только у каждого элемента спросить, какой у него тип, но не тип листа.

Костя
04.07.2018
10:15:01
просто я так понимаю type берется из параметра дженерика, и по нему нужно отдавать converter или null если этот converter не подходит к этому типу

и вот если у меня будут 2 converter для разных list

как поступить (

Alexander
04.07.2018
10:16:03
Ну нельзя дженерик в рантайме определить. Никак. Единственный способ - при создании вашего листа создать еще инстанс Class или KClass и тащить его с собой

Что собственно довольно нормальное решение, если это действительно нужно. Но в большинстве случаев, это можно обойти проверками на этапе компилляции

Собственно, в джаве для того type erasure сделано, чтобы народ гвозди микроскопами не забивал.

Sergey
04.07.2018
10:34:56
если у вас функция это какой-нибудь try/catch экспрешен, в каком случае вы всю функцию в экспрешен тоже конвертируете? или делаете body с return?

пардон, экспрешен на 5-10строк

Andrey
04.07.2018
10:44:23
Собственно, в джаве для того type erasure сделано, чтобы народ гвозди микроскопами не забивал.
Ну erasure для дженериков в джаве сделали скорее для двух целей: 1. Обеспечить обратную совместимость для collections и прочего. 2. Экономия памяти, так как без erasure с каждым экземпляром дженерик типа пришлось бы таскать ссылки на то, какими типами он параметризован.

Google
Alexander
04.07.2018
10:46:05
Я читал довольно много разных статей на эту тему. Во многих местах довольно авторитетно написано, что type erasure - это вообще правильно. И довольно сильный резон тут есть. Мест, где реально надо таскать с собой стертый тип в природе очень-очень мало.

Фактически это нужно только если какая-то динамическая генержка есть. Я в этих случаях просто таскаю с собой Class и особых проблем не ощущаю

Alexander
04.07.2018
10:48:07
Вообще не вижу проблемы. Я знаю, что мне часто хочется иметь self тип, но это уже не проблема erasure

Andrey
04.07.2018
10:48:46
dimiii
04.07.2018
10:49:13
если у вас функция это какой-нибудь try/catch экспрешен, в каком случае вы всю функцию в экспрешен тоже конвертируете? или делаете body с return?
Если вопрос про писать ли fun some(args) = expression - то ответ да, это поощряется code style, будь то try_expression, when_expression etc

Alexander
04.07.2018
10:50:00
Не вижу. У меня огромный кусок кода как раз с перегрузкой и опционалами. Я правда их сейчас на котлиновские нулябли везде заменяю.

dimiii
04.07.2018
10:50:32
Серьёзно? Не видишь проблемы с перегрузкой и maybe типами?
Тоже не вижу. Self тип делается через f-bounded polymorphism.

Alexander
04.07.2018
10:51:04
Все делается, но выглядит не очень.

Andrey
04.07.2018
10:51:37
Тоже не вижу. Self тип делается через f-bounded polymorphism.
Ага, в стиле гошечки решение) Нет дженериков, поэтому займёмся кодогенерацией)

Alexander
04.07.2018
10:52:29
Не нужно никакакой кодогенерации. Достаточно абстрактный метод, возавращающий тип сделать.

dimiii
04.07.2018
10:53:28
Ага, в стиле гошечки решение) Нет дженериков, поэтому займёмся кодогенерацией)
Ну не знаю, вполне прямолинейное решение. Стиль гошечки это использование письменности канадских аборигенов https://www.reddit.com/r/ProgrammerHumor/duplicates/688p46/they_arent_angle_brackets_theyre_characters_from/

Alexander
04.07.2018
10:54:48
Скажем так, часто хочется, чтобы дженерики не стирались. Тем не менее в подавляющем большинстве случаев, можно обойтись и со стиранием. Код со стертыми дженериками заведомо лучше и недажнее, чем с реифицированными (ну если там все не сделана на unsafe cast), так что идея, что типы надо сохранять только без этого уже совсем никак мне кажется разумной.

Andrey
04.07.2018
10:55:19
Ну не знаю, не пробовал :)
На джаве не писал никогда?)

Google
Alexander
04.07.2018
10:56:07
На джаве писал и до сих пор пишу и нравится. Котлин нравится больше, но и родная джава вполне хороша.

Igor
04.07.2018
10:56:41
Господа, плохо в ладах с синтаксисом, можете привести простой пример условия : " иначе - подтягивать привязку Родителя"?

Alexander
04.07.2018
10:56:58
Если код со стиранием, то все проверки заведомо делаются при компиляции. Если с реификацией, то скорее всего в рантайме.

Igor
04.07.2018
10:57:20
Ифом можно принебречь

Andrey
04.07.2018
10:57:46
Andrey
04.07.2018
10:57:50
Если код со стиранием, то все проверки заведомо делаются при компиляции. Если с реификацией, то скорее всего в рантайме.
А в чём проверить всё при компиляции без стирания?) Это же как со стиранием, только без.

Andrey
04.07.2018
10:59:38
А в чём проверить всё при компиляции без стирания?) Это же как со стиранием, только без.
В целом плохая практика делать проверки типов в рантайме. А отсутствие стирания делает эту плохую практику проще в исполнении. Всякие instanceof и прочее.

Alexander
04.07.2018
11:00:09
Именно.

Хотя когда припирает, раздражает, что его нет.

Andrey
04.07.2018
11:00:47
Блин, пропустил слово. А в чём проблема проверить все типы при компиляции?

Alexander
04.07.2018
11:01:18
В том, что если типы проверяются при компилляции, то не важно стерты дженерики или нет.

Alexander
04.07.2018
11:02:27
Зачем? хотим шаблонов?

Это уже не стирание типов, это совсем другая история

В шаблонах есть свой большой прелесть, но про них надо очень долго и усердно думать, а то получится C++.

Берял
04.07.2018
11:04:18
new T() сделай со стёртыми типами.
для начала убеди компилятор, что у T есть конструктор по-умолчанию

dimiii
04.07.2018
11:05:32
new T() сделай со стёртыми типами.
new T - c каким контрактом? Если есть представления, что делать с объектом, значит есть интерфейс, если нет представления - зачем писать такой код?

Берял
04.07.2018
11:05:50
class Foo<T> where T: new()
а на джаве?

Google
Andrey
04.07.2018
11:06:05
а на джаве?
Я не пишу на джаве.

Берял
04.07.2018
11:06:17
Я не пишу на джаве.
ну говоришь же про джаву

или другой jvm язык

Andrey
04.07.2018
11:06:27
ну говоришь же про джаву
Я говорю про стирание типов, а не про джаву.

Alexander
04.07.2018
11:06:28
На саом деле все это довольно легко делаться при помощи фабрик. Ну да, будет 5 строчек дополнительного кода. И что?

Берял
04.07.2018
11:06:51
Я говорю про стирание типов, а не про джаву.
ну а я тебе говорю, что new T() в jvm тебе мешает сделать нечто другое, не стирание типов

Andrey
04.07.2018
11:07:33
ну а я тебе говорю, что new T() в jvm тебе мешает сделать нечто другое, не стирание типов
Ок, что мешает? Невозможность задать сигнатуру конструктора?

Берял
04.07.2018
11:08:19
Ок, что мешает? Невозможность задать сигнатуру конструктора?
невозможность ограничить тип наличием определенного конструктора

Andrey
04.07.2018
11:08:45
невозможность ограничить тип наличием определенного конструктора
Ок, ограничиваем констируктором по умолчанию.

Всегда.

Берял
04.07.2018
11:09:06
Ок, ограничиваем констируктором по умолчанию.
ну ты не можешь это сделать в джаве, нет такого синтаксиса

Alexander
04.07.2018
11:09:21
Да не при чем тут джава

Andrey
04.07.2018
11:09:39
ну ты не можешь это сделать в джаве, нет такого синтаксиса
Мы не о джаве говорим, повторяюсь. Не о языке.

Я про спеку дженериков.

Берял
04.07.2018
11:10:13
Мы не о джаве говорим, повторяюсь. Не о языке.
а я говорю о причинах, которые мешают тебе реализовать то, что ты просишь. и первая причина это не стирание дженериков, а отсутствие синтаксиса для нужной тебе фичи

Alexander
04.07.2018
11:12:23
Синтакс тоже не при чем. Его довольно легко поменять

Костя
04.07.2018
11:47:56
а я правильно понимаю, что работа с кастомными аннотациями в котлин возможна только с добавлением либы kotlin.reflect ?

т.к. когда я получаю аннотации метода, моих кастомных там нету

Alexander
04.07.2018
11:49:33
Что подразумевается по дкстомными аннотациями?

Google
Костя
04.07.2018
11:50:04
мои созданные аннотации annotation class Name

я не сказал что это хорошо

рефлексия вообще такое себе

решение

dimiii
04.07.2018
11:50:33
Alexander
04.07.2018
11:50:50
Рефлекты для аннотаций не нужны

То есть нужен базовый рефлект, но он в ядре

Аннтоации должны быть использованы умеренно, но сами по себе они не плохи

Andrey
04.07.2018
11:53:32
Почему рак, и что плохого?
Если одним предложением: аннотации непрозрачны для программиста, особенно те, которые в рантайм обрабатываются. Если подробнее, то аннотируя что-либо, программист говорит: "давай ка, фреймворк, ты в этой точке свой код ещё прогони и сделай мне хорошо". Потом можно наловиться граблей и трудно исследуемых проблем из серии: "да какая ещё скотина эту аннотацию обрабатывает и как???"

Anton
04.07.2018
11:54:36
без аннотаций лучше жили?))

Sergey
04.07.2018
11:54:39
аннотации хороши для метаданных, типа валидации

а для остального такая себе затея

роуты лучше с дсл писать

Andrey
04.07.2018
11:55:04
Во многих случаях рантайм аннотации вполне заменимы функциями высших порядков.

Andrey
04.07.2018
11:57:00
Мне припекало, когда коллега использовал @Scheduled из спринговых, и каждое изменение параметров сопровождалось пересборкой приложения. Но все же не стоит всех под одну гребенку.
Я про сам механизм. Вставил аннотацию и не можешь быть точно уверен, какой код её будет обрабатывать. Особенно в большом проекте, где, например, несколько ORM

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