Size: a a a

Kotlin Community

2020 June 12

D

Denys in Kotlin Community
По-хорошему, исключительную ситуацию с отсутствующим значением нужно делать через исключения.
источник

VS

Vladimir Sitnikov in Kotlin Community
Denys
Очень интересный подход к проектированию. :)

К счастью, такого в Котлине нет, насколько я знаю. Даже если кастить явно (e.g. return null as String) - компилятор генерирует проверки и упадёт в рантайме.
Ну, там смысл есть. Просто compile-time проверок у них нет, поэтому и получается, что «формально передавать null нельзя, но, если передать, то можно»
источник

D

Denys in Kotlin Community
Vladimir Sitnikov
Ну, там смысл есть. Просто compile-time проверок у них нет, поэтому и получается, что «формально передавать null нельзя, но, если передать, то можно»
Как по мне, код, который так абюзит типизированный контракт, пахнет плохо. :)

На исключения никак не порефакторить уже?
источник

QH

Quantum Harmonizer in Kotlin Community
Vladimir Sitnikov
Есть Java интерфейс, у которого возвращаемое значение отмечено как @Nonnull.

public interface Transformer<OUT, IN> {
   OUT transform(IN in);
}


Но в некоторых случаях допускается возвращать null:

*
@param transformer The transformer to apply to values. May return {@code null}, in which case the provider will have no value.
* @since 4.3
*/
<S> Provider<S> map(Transformer<? extends S, ? super T> transformer);

При вызове такого из Kotlin возникает проблема: Kotlin видит nonnull и запрещает возвращать null. Есть какой-нибудь способ сказать компилятору «да, знаю что там nonnull, но вот в этом месте нужно игнорировать»?
можно ошибки компиляции подавлять =)
только никому не говорите
источник

VS

Vladimir Sitnikov in Kotlin Community
Denys
Как по мне, код, который так абюзит типизированный контракт, пахнет плохо. :)

На исключения никак не порефакторить уже?
Это сторонний код, который долго менять — Gradle.
источник

D

Denys in Kotlin Community
Vladimir Sitnikov
Это сторонний код, который долго менять — Gradle.
🤦‍♀️
источник

D

Denys in Kotlin Community
Тогда адаптеры какие-то делать с платформенным типом.
источник

VS

Vladimir Sitnikov in Kotlin Community
Я сделал

inline fun <reified T> T.toPlatformType() = Function.identity<T>().apply(this)

Но выглядит как костыль 😕
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Sitnikov
Я сделал

inline fun <reified T> T.toPlatformType() = Function.identity<T>().apply(this)

Но выглядит как костыль 😕
Ну, блин. Если там сломан контракт, то как это лечить не костылем?
источник

VS

Vladimir Sitnikov in Kotlin Community
Alexander Nozik
Ну, блин. Если там сломан контракт, то как это лечить не костылем?
Вдруг в stdlib уже есть такое toPlatformType?
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Sitnikov
Вдруг в stdlib уже есть такое toPlatformType?
Как я понял, проблема не в платформном типе, а в том, что навешана аннтоация, которая врет.
источник

VS

Vladimir Sitnikov in Kotlin Community
Alexander Nozik
Как я понял, проблема не в платформном типе, а в том, что навешана аннтоация, которая врет.
Да, аннотация врёт.

А платформенный тип помогает сказать котлину: «там что-то вернётся, но ты не смотри nullable оно или нет»
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Sitnikov
Да, аннотация врёт.

А платформенный тип помогает сказать котлину: «там что-то вернётся, но ты не смотри nullable оно или нет»
А просто руками написать там нулябельный тип?
источник

VS

Vladimir Sitnikov in Kotlin Community
Alexander Nozik
А просто руками написать там нулябельный тип?
Не получается.

Пишешь object: Transformer … и kotlin ругается, что нельзя переопределять возвращаемое значение как nullable
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Sitnikov
Не получается.

Пишешь object: Transformer … и kotlin ругается, что нельзя переопределять возвращаемое значение как nullable
Ну тогда костыль с ручной проверкой. Я такой делал в JS, там тоже в одном месте у меня контракт говорит, что возвращается один тип, но иногда возвращается другой. Поэтому я руками проверяю на тип, хотя в котлине он формально определен
источник

VS

Vladimir Sitnikov in Kotlin Community
Alexander Nozik
Ну тогда костыль с ручной проверкой. Я такой делал в JS, там тоже в одном месте у меня контракт говорит, что возвращается один тип, но иногда возвращается другой. Поэтому я руками проверяю на тип, хотя в котлине он формально определен
Так мне не получить, а передать нужно.
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Sitnikov
Так мне не получить, а передать нужно.
Сделать каст T к T?
источник

VS

Vladimir Sitnikov in Kotlin Community
Alexander Nozik
Сделать каст T к T?
мне нужно T? в T
источник

AN

Alexander Nozik in Kotlin Community
Vladimir Sitnikov
мне нужно T? в T
Ну не важно, ручной каст и подавить ворнинг. Должно работать
источник

D

Denys in Kotlin Community
Alexander Nozik
Ну не важно, ручной каст и подавить ворнинг. Должно работать
Э? :)
источник