@kotlin_lang

Страница 242 из 982
Михаил
11.07.2017
15:23:45
companion object { val app by lazy { this@Application } }

Хоте нет))

Igor
11.07.2017
15:24:41
Хоте нет))
Я было подумал, что от меня скрыли часть языка ?

Михаил
11.07.2017
15:24:53
А что тут такого?

Google
Михаил
11.07.2017
15:25:17
Разве что из компаниона не обратьться к зис

Igor
11.07.2017
15:25:30
Разве что из компаниона не обратьться к зис
ты обратишься к this компаньена, а не Application

Михаил
11.07.2017
15:26:24
Там сабака стоит

Но тут это не спасет

Igor
11.07.2017
15:27:50
Вот именно что скомпилируется только val app by lazy { this@Companion }

В общем окей, что бы со стороны оно виделось как val - заюзаю 2 поля

Михаил
11.07.2017
15:30:00
Есть мысль сделать свой делегат в котором можно будет сэтить контекст

object AppInstanceHolder { getValue... init(app:App) }

Но на деле ничем от двух полей не отличается кроме неявности лишней

Boris
11.07.2017
15:35:34
думаю есть только два способа скрыть что проперти var это за другим полем или за интерфейсом

Михаил
11.07.2017
15:44:35
Вообще читал в заметкам к одному из пререлизов котлина что есть планы по lateinit val, но это не будет лейтинит вал (если ничего не путаю)

Boris
11.07.2017
17:01:25
а вот кто-нибудь знает, почему нельзя вот так написать? var clientId: String override get set

я имею ввиду, если я имплементирую джавовский интерфейс с методом String getClientId(), то было бы здорово иметь возможность пропертю обявить так, чтобы геттер оверрайдил этот метод

Google
Михаил
11.07.2017
17:03:09
Boris
11.07.2017
17:03:30
т.е. вроде очевидная фигня, но не работает

Igor
11.07.2017
17:05:09
а разве у get есть возможность поставить override?
По-идее - должна быть, в доках что-то такое мутно написано

Igor
11.07.2017
17:06:59
Вот про простые аксессоры что-то написано https://discuss.kotlinlang.org/t/custom-getter-setter-for-properties-created-by-type-params/46/5

Михаил
11.07.2017
17:07:02
не понял
ну в котлин просто методы и get/set для проперти имеют разную природу, соответственно они не могут заменять друг друга, и при реализации интерфейса его метод должен был переопределен независимо от пропертей

Руслан
11.07.2017
17:07:27
Igor
11.07.2017
17:07:37
https://kotlinlang.org/docs/reference/classes.html#overriding-properties

А это доки

Михаил
11.07.2017
17:10:03
https://kotlinlang.org/docs/reference/classes.html#overriding-properties
смысл в том, что в классе есть проперти clientId и этот класс реализует интерфейс с методом String getClientId(), и хочется, чтобы геттер у проперти переопределял метод интерфейса

Boris
11.07.2017
17:11:28
https://youtrack.jetbrains.com/issue/KT-6653

Igor
11.07.2017
17:11:42
Boris
11.07.2017
17:27:47
Интересно, что Андрей Бреслав в этом ишью не дает внятного ответа про то какими собственно рисками чревата такая функциональность

Михаил
11.07.2017
17:30:34
Интересно, что Андрей Бреслав в этом ишью не дает внятного ответа про то какими собственно рисками чревата такая функциональность
А если ты в классе A реализовал этот метод интерфейса как геттер, унаследовал класс B от A, а затем решил переопределить метод интерфейса?

Boris
11.07.2017
17:31:07
ну да, он так и пишет, что работать это может только так: a function can override a property, and a property can override a function

но в чем собственно проблема не до конца понятно, возможно это может паламать существующий код, конечно, но так вот с ходу непонятно

Google
Михаил
11.07.2017
17:32:19
Ну а вообще, как я писал выше, "методы и get/set для проперти имеют разную природу", тут в принципе такой подход использовать нелогично

Михаил
11.07.2017
17:32:46
так а в чем собственно проблема-то?
в том, что у тебя все еще есть проперти с этим геттером, а геттер ты по факту переопределил

ну и ты как бы переопределяешь метод интерфейса, даже не думая, что это еще и геттер у проперти

еще раз говорю, "методы и get/set для проперти имеют разную природу", поэтому они используются и воспринимаются (по умолчанию) как разные вещи, и мешать их друг с другом лично я бы не стал

Boris
11.07.2017
17:35:57
Ну а вообще, как я писал выше, "методы и get/set для проперти имеют разную природу", тут в принципе такой подход использовать нелогично
так можно было бы говорить, если бы фичей котлина не была совместимость с джавой 100%, а так получается, что не смотря на то, что проперти в сущности своей это пара акцессоров при любом раскладе, получается, что для поддержки этой функциональности нужно костылить

еще раз говорю, "методы и get/set для проперти имеют разную природу", поэтому они используются и воспринимаются (по умолчанию) как разные вещи, и мешать их друг с другом лично я бы не стал
опять же это можно было бы сделать только как совместимость к джавой вроде как САМ сделан только для джава-классов -- просто для того, чтобы иметь совместимость пропертей и джава-бинов

ведь в других местах они с ними совместимы

Михаил
11.07.2017
17:39:35
опять же это можно было бы сделать только как совместимость к джавой вроде как САМ сделан только для джава-классов -- просто для того, чтобы иметь совместимость пропертей и джава-бинов
ну в котлине же, в отличие от джавы, нет возможности в String писать null, также нет возможности и аксессор использовать как обычный метод

то, что в джаве что-то можно, еще не значит, что это хорошо

Boris
11.07.2017
17:41:17
иначе это был бы треш

Boris
11.07.2017
17:42:12
то, что в джаве что-то можно, еще не значит, что это хорошо
если в джаве что-то можно, значит скорее всего это что-то используется и с этим нужна какая-то совместимость

это будет уже другой тип
это будет как раз джавовский String, так что если говорить строго то в котлине можно писать null в джавовый String

Михаил
11.07.2017
17:43:41
ну а вообще, Бреслав сколько уже раз говорил, что в котлине "все explicit", взаимозаменяемость геттера и наследуемого от интерфейса метода не очень explicit, когда нужно этот метод переопределить

Boris
11.07.2017
17:44:16
мы ведь говорить про совместимость, я не стану спорить, что без такой фичи языка как таковой можно было бы и обойтись, даже лучше было бы обойтись, чтобы концепцию пропертей не размывать, но вот в контексте совместимости с джавой этот вопрос уже не такой однозначный

Boris
11.07.2017
17:46:33
ну а вообще, Бреслав сколько уже раз говорил, что в котлине "все explicit", взаимозаменяемость геттера и наследуемого от интерфейса метода не очень explicit, когда нужно этот метод переопределить
explicit в данном случае это явное обозначение его как override, остальное тоже можно сделать явным имея желание, аннотацию специальную как это сделано для некоторых других моментов

Михаил
11.07.2017
17:47:54
explicit в данном случае это явное обозначение его как override, остальное тоже можно сделать явным имея желание, аннотацию специальную как это сделано для некоторых других моментов
ты этот override в наследнике не сразу увидишь, кроме того, какой-нибудь другой человек может потом пару часов потратить, чтобы понять, почему у него проперти неправильно работает, когда он всего лишь переопределил метод интерфейса

Google
Boris
11.07.2017
17:47:54
вот что важнее - хороший, понятный explicit язык, или совместимость с джавой во всем?
я просто не до конца понимаю, почему нужно выбирать, не вижу для этого причин. Понимаю, что они очевидно есть, если Бреслав считает, что реализация затруднительна, просто хотелось бы услышать эти сообрежения

Михаил
11.07.2017
17:50:41
я просто не до конца понимаю, почему нужно выбирать, не вижу для этого причин. Понимаю, что они очевидно есть, если Бреслав считает, что реализация затруднительна, просто хотелось бы услышать эти сообрежения
как по мне, описанный мной выше пример вполне показывает, что такая фича неоднозначна, и решение по добавлению ее в язык тоже неоднозначно

Boris
11.07.2017
17:52:54
ты этот override в наследнике не сразу увидишь, кроме того, какой-нибудь другой человек может потом пару часов потратить, чтобы понять, почему у него проперти неправильно работает, когда он всего лишь переопределил метод интерфейса
ну это не повод, если ты не видишь что метод переопределен, то не важно проперти это или нет, ты попадаешь в ситуацию, когда ты не понимаешь, почему у тебя не такое поведение, которое ты ожидаешь

однако переопределение как таковое существует

Михаил
11.07.2017
17:54:36
ну это не повод, если ты не видишь что метод переопределен, то не важно проперти это или нет, ты попадаешь в ситуацию, когда ты не понимаешь, почему у тебя не такое поведение, которое ты ожидаешь
Кстати, в джаве аксессоры являются методами и рассматриваются как методы, в котлине же аксессоры методами не являются (и как методы не рассматриваются), поэтому переопределять аксессор с помощью метода и метод с помощью аксессора нелогично как минимум. Правда, я уже повторяюсь

Boris
11.07.2017
17:56:19
в котлине это тоже методы, просто привязанные к проперти, ты недвусмысленно задаешь их при определении проперти

Михаил
11.07.2017
17:57:51
в котлине это тоже методы, просто привязанные к проперти, ты недвусмысленно задаешь их при определении проперти
Ну тогда скажу так: Как-то нелогично, что метод, не привязанный к проперти (метод интерфейса), будет менять эту проперти

И вообще, Бреслав (или даже Жемеров) не раз говорил, что (примерно) если какая-то фича несет в себе какие-то неоднозначности, то они (разрабы котлина) несколько раз подумают, прежде чем вводить эту фичу в язык

Boris
11.07.2017
18:02:19
опять же я еще раз говорю, что это могло бы быть специальной аннотацией вроде @JvmAccessorOverride или типа того, которая бы давала возможность переопределить джавовский аксессор. И еще раз: я понимаю, что эта фича которая требует продумывания, просто хотелось услышать мотивацию, почему за это не берутся и пока я услашал только одну на мой взгляд важную причину, это что в языке пришлось бы делать возможность переопределять проперти-акцессор методом, потому что иначе не все кейзы были бы покрыты, но возможно эти кейзы лучше было бы запретить, чем запретить оверрайд как таковой

Admin
ERROR: S client not available

Михаил
11.07.2017
18:06:54
опять же я еще раз говорю, что это могло бы быть специальной аннотацией вроде @JvmAccessorOverride или типа того, которая бы давала возможность переопределить джавовский аксессор. И еще раз: я понимаю, что эта фича которая требует продумывания, просто хотелось услышать мотивацию, почему за это не берутся и пока я услашал только одну на мой взгляд важную причину, это что в языке пришлось бы делать возможность переопределять проперти-акцессор методом, потому что иначе не все кейзы были бы покрыты, но возможно эти кейзы лучше было бы запретить, чем запретить оверрайд как таковой
Ну если так, то вопрос с моей стороны: а кто-то разрабам котлина предлагал сделать эту фичу в виде аннотации? (просто если нет, то вполне возможно, что фича эта рассматривалась только именно как постоянная фича языка, а не как доп средство для интероперабилити типа @JvmStatic)

Михаил
11.07.2017
18:11:09
я пока не предлагал, вот решил сначала обсудить тут кто что об этом думает, спасибо большое тебе, что высказал свои мысли
Ну свои мысли по поводу внедрения этой фичи как фичи языка я высказал, а по поводу внедрения как фичи совместимости (то бишь в виде аннотации) - ничего против не имею, скорее даже соглашусь, что такая возможность должна быть

Boris
11.07.2017
18:11:10
вцелом согласен с тем, что такая фича языка усложнила бы язык и это действительно нужно только как фича совместимости

Жабра
11.07.2017
19:05:41
Кто-нибудь, скажите мне, есть вариант обойти ограничение на то, что в функцию нельзя передавать var переменную?

Boris
11.07.2017
19:06:14
чо?

почему нельзя?

Жабра
11.07.2017
19:07:14
Вот так. .-. Говорит "к этому моменту эта переменная могла быть изменена, поэтому иди н***й".

Boris
11.07.2017
19:07:50
может пример кода?

Михаил
11.07.2017
19:07:57
наверное речь о nullable var, а функция принимает nonnull

Google
Boris
11.07.2017
19:08:00
наверное типы разные

Жабра
11.07.2017
19:08:24
В том-то и дело, что проверка на null проходит преждевременно.

Boris
11.07.2017
19:11:01
можно, да, если по-простому, то вот так: fun test() { var a:Int? = 10 a?.let { va -> call(va) } } fun call(a: Int) { }

Михаил
11.07.2017
19:11:55
a!!

:)

Boris
11.07.2017
19:12:34
или так вот: fun test() { var a:Int? = 10 val va = a if (va != null) { call(va) } } fun call(a: Int) { }

Жабра
11.07.2017
19:12:40


A, я забыл там дописать в основном add

Но не важно

Михаил
11.07.2017
19:13:51
типы не совпадают

передаешь Int? в аргумент с Int

Жабра
11.07.2017
19:14:32
Проверяя, не является ли null

Михаил
11.07.2017
19:14:46
для var не работает смарткаст

Жабра
11.07.2017
19:14:59
И что делать?

Михаил
11.07.2017
19:15:02
поставь !!.

Жабра
11.07.2017
19:15:26
Окей

Boris
11.07.2017
19:15:39
data class A(var prop: Int? = null) fun test() { val a = A() a.prop.let { prop -> if (prop != null) { call(prop) } else { somethingElse() } } } fun call(a: Int) { }

Жабра
11.07.2017
19:16:23
поставь !!.
Спасибо

Boris
11.07.2017
19:16:38
ой

Михаил
11.07.2017
19:16:40
но это вариант для плохих парней :D

Жабра
11.07.2017
19:17:05
А для "хороших"?

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