@kotlin_lang

Страница 860 из 982
Oleg
12.09.2018
05:01:58
а что поменялось?
https://discuss.kotlinlang.org/t/kotlin-1-3-m2-new-multiplatform-projects-model/9264

Andrei
12.09.2018
07:26:29
а можно как-то достать через reflection у метода в интерфейсе дефолтную инициализацию параметра?

Bogdan
12.09.2018
07:28:21
Andrei
12.09.2018
07:29:49
Ты про v: Int = 100, хочешь достать 100 ? Если да то нельзя
ага, interface SomeService { fun get(someId: UUID, someOptions: SomeOptions = SomeOptions.init()): SomeResult? }

Google
Bogdan
12.09.2018
07:32:00
ага, interface SomeService { fun get(someId: UUID, someOptions: SomeOptions = SomeOptions.init()): SomeResult? }
Для дефолтных параметров генерируется метод, к котором и задаются дефолтные, то-есть они внутри метода

Bogdan
12.09.2018
07:37:00
и к этому методу не достучаться?
Ну даже если и достучаться то нужно уже влезать в внутирь, а это шарить байт код. Ты лучше напиши что ты хочешь сделать

Andrei
12.09.2018
07:40:31
Ну даже если и достучаться то нужно уже влезать в внутирь, а это шарить байт код. Ты лучше напиши что ты хочешь сделать
хочу вызвать SomeServiceImpl.get(someId), someOptions при этом не используя (он же опциональный). Если дефотных параметров нет, то все работает, с дефолтным вот проблема

Boris
12.09.2018
07:44:15
Если у метода есть реализация, то вызвать его просто, если нет, то бессмысленно

Даже если у него есть параметр со значением по-умолчанию

Andrei
12.09.2018
07:47:20
interface SomeService { fun get(someId: UUID, someOptions: SomeOptions = SomeOptions.init()): SomeResult? } @Component internal open class SomeServiceImpl: SomeService( override fun get(SomeId: UUID, SomeOptions: SomeOptions): SomeResult? = { // doSomething() } }

Дмитрий
12.09.2018
07:49:44
а наследование от интерфейса разве не надо для каласса указать?

Andrei
12.09.2018
07:49:53
кидается эксепшн из KCallalbeImpl.kt #154 val caller = defaultCaller ?: throw KotlinReflectionInternalError("This callable does not support a default call: $descriptor")

Boris
12.09.2018
07:52:33
Ах, ты через рефлекшн её дергаешь

Тогда самого главного кода ты и не прислал ?

Google
Boris
12.09.2018
07:53:37
Если много, лучше в гист положить

Bogdan
12.09.2018
08:04:32
Может придумаешь как его вызвать

Boris
12.09.2018
08:08:03
interface SomeService { fun get(someId: UUID, someOptions: SomeOptions = SomeOptions.init()): SomeResult? } @Component internal open class SomeServiceImpl: SomeService( override fun get(SomeId: UUID, SomeOptions: SomeOptions): SomeResult? = { // doSomething() } }
я тут понял, что ты ведь пытаешься вызвать метод у класса SomeServiceImpl, а не у SomeService. А у него вполне закономерно нету дефлотных параметров

Andrei
12.09.2018
08:10:38
Если не влом декомпилируй и посмотри во что превращается дефолтный метод
компаньон получается, GETSTATIC bla-bla/requests/SomeOptions.Companion : Lbla-bla/requests/SomeOptions$Companion; INVOKEVIRTUAL bla-bla/requests/SomeOptions$Companion.init ()Lbla-bla/requests/SomeOptions;

Boris
12.09.2018
08:19:26
да, похоже нет смысла присылать код который пытется вызывать — это всё равно не будет работать, в декларации этот параметр всегда есть, а для вызова без этого параметра создается синтетический метод

@Andreichernov https://discuss.kotlinlang.org/t/kotlin-reflection-and-default-values/2254/2

Boris
12.09.2018
08:51:45
ах-а-ха, забавно. Делайте ставки, что выводит этот код: interface A { fun call(value: String = "") } class B : A { override fun call(value: String) { } } fun main(args: Array<String>) { val b = B() val call = A::class.declaredMemberFunctions.first { it.name == "call" } val valueParameter = call.parameters.drop(1).first() require(valueParameter.isOptional) call.callBy(mapOf(call.instanceParameter!! to b)) }

потом смотрим описание метода callBy: Calls this callable with the specified mapping of parameters to arguments and returns the result. If a parameter is not found in the mapping and is not optional (as per [KParameter.isOptional]), or its type does not match the type of the provided value, an exception is thrown.

ну если никому не интересно, не буду тогда писать ответ

Max
12.09.2018
09:02:51
все замерли в ожидании

Boris
12.09.2018
09:03:06
похоже на то, да

Max
12.09.2018
09:03:16
жги)

Boris
12.09.2018
09:05:04
мдэ, ну ладно, не получилось пазлера

можно было бы ожидать, что ничего у нас не выведется — потому что мы не передали только опциональный параметр, но по факту получаем: Exception in thread "main" kotlin.reflect.jvm.internal.KotlinReflectionInternalError: This callable does not support a default call: public abstract fun call(value: kotlin.String = ...): kotlin.Unit defined in A[DeserializedSimpleFunctionDescriptor@742ff096]

еще был вариант, что параметр не опциональный, однако нет — проверку он проходит

так же интересно, что если получать метод у класса B, то параметр по прежнему опциональный. Однако, как можно догадаться, рузультат получается тот же

Google
Boris
12.09.2018
09:15:08
тут как в том анекдоте: ты или крест сними или турсы надень. Надо или доку поправить или убрать у этих парамтеров опциональность

или реализовать default call ?

Andrei
12.09.2018
09:18:48
в #152 defaultCaller null получается https://github.com/JetBrains/kotlin/blob/master/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KCallableImpl.kt#L109

Boris
12.09.2018
09:19:01
ну да, я уже посмотрел

Max
12.09.2018
09:23:15
Приветствую! Не подскажите, можно ли в exposed смапить в поле Entity например строкове значение из таблицы в экземпляр какого-то класса конструкторого которого принимает строку?

Boris
12.09.2018
09:33:16
хм, а не находит он defaultCaller потому что он пытается искать метод с параметрами A, String, Int, Object,а по факту он public static synthetic bridge call$default(LA;Ljava/lang/String;ILjava/lang/Object;)V

без маски Int-ового параметра

возможно это просто баг

и ищет он его в другом классе. По факту метод call$default сгенерен в A$DefaultImpls, а ищет он его непосредственно в A

похоже, просто не поддерживает сейчас рефлекшн такие дефолты — хотя похоже мог бы

Sergey
12.09.2018
10:09:32
Нас не перестают радовать релизами. Много чего переработали и пофиксили IO пул с прошлого релиза https://github.com/Kotlin/kotlinx.coroutines/releases/tag/0.26.0

https://medium.com/@elizarov/structured-concurrency-722d765aa952

Denis
12.09.2018
11:56:05
добрый день. никак не могу разобраться с дженериками в котлине. у меня есть функция, которая возвращае коллекцию list<T>

создаю эту коллекцию, но не могу в неё ничего положить

Mi
12.09.2018
11:57:15
создаю эту коллекцию, но не могу в неё ничего положить
Потому что в котлине есть понятие мутабельного и иммутабельного списка

Ivan
12.09.2018
11:57:15
Возвращай ArrayList<T>

Руслан
12.09.2018
11:57:33
Denis
12.09.2018
11:58:17
MutableList
да, в mutableList тоже ничего положить не могу)



ошибка при попытке положить что-либо

Google
Denis
12.09.2018
11:59:18
предполагаю, если помещать object as T, то тип потеряется

Руслан
12.09.2018
12:01:13
ну тут явно проблема в дженериках, смотри как у тебя T объявлен

Denis
12.09.2018
12:01:29
class DataSourceProviderImpl<T>: DataSourceProvider<T> {

вроде стандартно

Bogdan
12.09.2018
12:02:01
типы нужно указывать явно

val documentsDataList = mutableListOf<RowDataModel<Double>>()

Denis
12.09.2018
12:02:30
Руслан
12.09.2018
12:02:34
class DataSourceProviderImpl<T>: DataSourceProvider<T> {
Ну вот, у тебя какой-то абстрактный T, а ты туда хочешь DocumentsTypes запихнуть

Admin
ERROR: S client not available

Denis
12.09.2018
12:03:30
не понял, а как я явно укажу тип коллекции, если там у меня дженерик?

т.е. получается объявлять дженерик не дженериком?)

Bogdan
12.09.2018
12:04:12
не понял, а как я явно укажу тип коллекции, если там у меня дженерик?
а что в твоем понимании дженерик ? и как ими пользоватся ?

т.е. получается объявлять дженерик не дженериком?)
Дженерик делается при объевлении класса, при использовании нужно указывать тип

Denis
12.09.2018
12:06:05
в купе с коллекцией, это какой-то общий тип, в эту коллекцию могут помещаться различные типы, потом по обращению к элементу возвращается обобщенный класс (дженерик) и можно его закастить к определенному типу (если это он фк)

Bogdan
12.09.2018
12:06:41
Т - это класс\интерфейс ?

Denis
12.09.2018
12:06:59
Bogdan
12.09.2018
12:07:08
мм, нет
а что тогда ?

Denis
12.09.2018
12:07:12


я хочу создать коллекцию этих моделей

Bogdan
12.09.2018
12:07:39
я хочу создать коллекцию этих моделей
https://kotlinlang.ru/docs/reference/generics.html

Google
Bogdan
12.09.2018
12:07:41
вот

https://kotlinlang.ru/docs/reference/generics.html
хотя лучше на анг. ресурсе

Denis
12.09.2018
12:11:36
блин а чем они тогда дженерики, если нужно объявлять тип

Руслан
12.09.2018
12:13:06
блин а чем они тогда дженерики, если нужно объявлять тип
Тем чтобы писать общий код, а ты пытаешься в куске общего кода написать конкретный. Либо нужно сказать что этот общий код не такой уж общий, ограничить T до наследников DocmentsType как посоветовал @dimiiim, либо отказаться от идеи тут писать конкретный код

dimiii
12.09.2018
12:13:12
блин а чем они тогда дженерики, если нужно объявлять тип
Верхнюю границу, ты еще спроси зачем интерфейсы нужны

Denis
12.09.2018
12:14:43
я хочу написать общий код, но дженерики заставляют меня объявить им тип, тем самым делая код не общим, а конкретным

Похоже, что-то не до конца понимаю, пойду читать доку

Bogdan
12.09.2018
12:18:14
я хочу написать общий код, но дженерики заставляют меня объявить им тип, тем самым делая код не общим, а конкретным
тубу нужен конкретный тип при использовании, как mutableList какой тип ты будешь использовать ? Можешь посмотреть код колекций

dimiii
12.09.2018
12:18:33
Похоже, что-то не до конца понимаю, пойду читать доку
Если что, <T> буквально означает <T: Object> или <T: Any!>

Denis
12.09.2018
12:19:19
Если что, <T> буквально означает <T: Object> или <T: Any!>
это знает, в котлине все объекты унаследованы от Any

Bogdan
12.09.2018
12:19:25
Denis
12.09.2018
12:19:51
соотвественно, логично предположить, если указать входные параметры, то на место T можно всё что угодно закинуть

Bogdan
12.09.2018
12:19:59
Denis
12.09.2018
12:20:03
но компилятор просит именно T, лол

Bogdan
12.09.2018
12:21:38
но компилятор просит именно T, лол
где ? ты mutableList<MyClass<T>> написал

Руслан
12.09.2018
12:22:09
но компилятор просит именно T, лол
Вот тебе пример для размышления: interface Generic<T> { fun produce(): T } class MyClass<T> : Generic<T> { override fun produce(): T { return "" } }

Bogdan
12.09.2018
12:23:44
где ? ты mutableList<MyClass<T>> написал
mutableList - должен знать что в него могут запихивать, поэтому для него нужно сказать конкретный тип, типы могут опускатся если котлни компилятор может их сам вывести

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