
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

Google

Bogdan
12.09.2018
07:32:00

Andrei
12.09.2018
07:33:37

Bogdan
12.09.2018
07:37:00

Andrei
12.09.2018
07:40:31

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

Andrei
12.09.2018
08:10:38

Boris
12.09.2018
08:19:26
да, похоже нет смысла присылать код который пытется вызывать — это всё равно не будет работать, в декларации этот параметр всегда есть, а для вызова без этого параметра создается синтетический метод
@Andreichernov https://discuss.kotlinlang.org/t/kotlin-reflection-and-default-values/2254/2

Andrei
12.09.2018
08:46:58

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

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

Google

dimiii
12.09.2018
12:07:40

Bogdan
12.09.2018
12:07:41
вот

Руслан
12.09.2018
12:11:13

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

dimiii
12.09.2018
12:18:33

Denis
12.09.2018
12:19:19

Bogdan
12.09.2018
12:19:25

Руслан
12.09.2018
12:19:28

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

Руслан
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 - должен знать что в него могут запихивать, поэтому для него нужно сказать конкретный тип, типы могут опускатся если котлни компилятор может их сам вывести