@kotlin_lang

Страница 649 из 982
Pavel
23.04.2018
22:03:45
https://simplecat.tk/shots/shot-20180424-010336.png

DY
23.04.2018
22:06:55
build.gradle и все остальное должны на уровень выше лежать, по идее. не внутри src

а, показалось

Pavel
23.04.2018
22:07:32
Ага)

Google
Pavel
23.04.2018
22:08:58
У меня вообще нет предположений.

DY
23.04.2018
22:10:41
а если новый проект создать всё ок?

Pavel
23.04.2018
22:11:13
Я не пробовал. Просто это и есть новый проект)

DY
23.04.2018
22:12:31
что-то с ним не так, мб ? но я тоже не вижу причины

Александр
23.04.2018
22:14:19
А почему груп и версию выделяет в билде?

Pavel
23.04.2018
22:17:06
https://simplecat.tk/shots/shot-20180424-011625.png Вот такая подсказка. Но вообще она горит прям после создания нового проекта.

version тоже самое

Александр
23.04.2018
22:19:02
А рефреш (обновление проекта, хз как называется) в градл вкладке ничо не дает?

DY
23.04.2018
22:19:04
да, студия часто начала в грэдле на такое ругаться, в чем причина не знаю)

Pavel
23.04.2018
22:19:16
Выяснил, что создание нового проекта решает проблему.

DY
23.04.2018
22:19:18
https://simplecat.tk/shots/shot-20180424-010336.png
попробуй потереть все директории кроме src и gradle, и файлы в корне, которые студия создает, и заново импортнуть

Google
Pavel
23.04.2018
22:23:05
Лан парни, спасибо, я ща быстренько перескочу на новый проект. Благо тут три файла.

Alexey
24.04.2018
07:38:57
Тут какое странное поведение заметил с ObjectMapper + reified https://gist.github.com/tethys-json/75129d69c7b0d6cd8a970898ef77bd6d

Подскажите в чем трабл

По идеи же должен получится одинаковый код

Или всё таки есть какие то ограничения на вложенные reified?

dimiii
24.04.2018
08:18:47
fun main(args: Array<String>) { val mapper = ObjectMapper().registerKotlinModule() val json = """{"foo":{"bar":1}}""" val f1 = mapper.readValue<Wrapper<Foo>>(json).foo val f2 = reifiedParse<Foo>(mapper, json) } Exception in thread "main" java.lang.ClassCastException: java.base/java.util.LinkedHashMap cannot be cast to Foo at QuestionsKt.main(questions.kt:77)

Найс

Alexey
24.04.2018
08:19:05
Ну дак да

Видимо с вложенными типами беда

dimiii
24.04.2018
08:19:59
Ну дак да
Жуть какая, надо будет присмотреться, глаз алмаз!

Ну дак да
Лечится кстати квантификацией по Foo: <reified A: Foo>

Va
24.04.2018
08:37:03
Видимо с вложенными типами беда
именно для этого gson и прочие сериализаторы придумали себе TypeToken

Alexey
24.04.2018
08:38:06
именно для этого gson и прочие сериализаторы придумали себе TypeToken
Там делается TypeReference, и как это связано с reified не очень понятно

Quantum Harmonizer
24.04.2018
08:39:14
reified полне может использоваться как полноценный type-аргумент для TypeToken/TypeReference.

dimiii
24.04.2018
08:40:19
Там делается TypeReference, и как это связано с reified не очень понятно
Да я так, в продолжение дискуссии, кажется что-то не так с системой типов, раз программа компилируется и падает с исключением времени исполнения.

Quantum Harmonizer
24.04.2018
08:41:04
dimiii
24.04.2018
08:42:09
ну так дженерики не reified, очевидено, что это не идеальное решение, а компромисс
А где-то эти подводные камни собраны уже? Хочется сразу почитать, чем выискивать в сети

Alexey
24.04.2018
08:42:09
Странная херня в байткоде public final class BugKt$main$$inlined$readValue$1 extends com.fasterxml.jackson.core.type.TypeReference<Wrapper<Foo>> public final class BugKt$reifiedParse$$inlined$readValue$1 extends com.fasterxml.jackson.core.type.TypeReference<Wrapper<A>>

Quantum Harmonizer
24.04.2018
08:42:38
Google
Alexey
24.04.2018
08:43:16
получается inline - это вовсе не инлайн, там еще нагенерились статик функции

Sergey
24.04.2018
08:44:46
просто в readValue используется как раз хак с анонимным классом в inline функции. поэтому на каждый вызов readValue генерируется класс

а то что типы не проходят через две инлайн функции похоже на баг компилятора

можете com.fasterxml.jackson.module.kotlin.readValue показать?

Va
24.04.2018
08:46:03
Alexey
24.04.2018
08:46:10
https://gist.github.com/tethys-json/bdf890cb9cd9647d0e1d7d721006b441

можете com.fasterxml.jackson.module.kotlin.readValue показать?
inline fun <reified T: Any> jacksonTypeRef(): TypeReference<T> = object: TypeReference<T>() {} inline fun <reified T: Any> ObjectMapper.readValue(content: String): T = readValue(content, jacksonTypeRef<T>())

Sergey
24.04.2018
08:47:19
статик сгенерился чтобы функцию можно было вызывать из явы, в вашем примере этот статик не вызывается

все содержимое reifiedParse как раз подставилось в main

Alexey
24.04.2018
08:48:19
Собственно вот тут и есть проблема TypeReference localTypeReference = (TypeReference)new BugKt.reifiedParse..inlined.readValue.1(); Тип не указывается, и поэтому там Object подставляется и в ObjectMapper генерит Map

Alexey
24.04.2018
08:48:28
Ну это конечно подстава от компилятора

Alexey
24.04.2018
08:50:07
от jvm
Причем тут jvm то?

Это компилятор не подставил все типы

Va
24.04.2018
08:50:35
потому что не было бы type erasure, все было бы ок )

Quantum Harmonizer
24.04.2018
08:50:48
Alexey
24.04.2018
08:50:49
были бы другие проблемы

Quantum Harmonizer
24.04.2018
08:51:17
потому что не было бы type erasure, все было бы ок )
в JVM это by design, а в компиляторе — баг, если всё так, как тут говорят

Google
Евгений
24.04.2018
08:53:07
помоему все работает как задуманно, дженерики в жаве же так и работают, вычисляется максимально подходящий общий тип, у тебя в коде явно прописано шо женерик есть Any, а Any ничто иное как Object, там где-то вверху кастуй как тебе надо, но внутри функции будет все равно Object

Admin
ERROR: S client not available

Quantum Harmonizer
24.04.2018
08:54:48
тут есть ключевое слово reified

Sergey
24.04.2018
08:59:42
вобще на простом примере не воспроизводится: abstract class TypeToken<T> inline fun <reified T> a() = ((object : TypeToken<T>() {}).javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] inline fun <reified T> b() = a<T>() class Test fun main(args: Array<String>) { println(a<List<Test>>()) println(b<List<Test>>()) } java.util.List<? extends Test> java.util.List<? extends Test>

Sergey
24.04.2018
09:01:17
ну, там list<T>

можно еще вложить, сейчас

Alexey
24.04.2018
09:01:29
нет

Внутри функции a

Sergey
24.04.2018
09:02:17
а, понял

Alexey
24.04.2018
09:03:18
У меня в итоге вот так Wrapper<A>

Sergey
24.04.2018
09:03:23
abstract class TypeToken<T> inline fun <reified T> a() = ((object : TypeToken<T>() {}).javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] inline fun <reified T> b() = a<List<T>>() class Test fun main(args: Array<String>) { println(a<List<Test>>()) println(b<Test>()) } java.util.List<? extends Test> java.util.List<? extends T>

да, так не пашет

Alexey
24.04.2018
09:04:18
Quantum можешь завести тикет, если не сильно впадлу?

Quantum Harmonizer
24.04.2018
09:05:07
кажется, уже есть https://youtrack.jetbrains.com/issue/KT-11825

Alexey
24.04.2018
09:05:43
?

dimiii
24.04.2018
09:05:50
07 Apr 2016 17:46 - лол кек чебурек

Google
dimiii
24.04.2018
09:06:18
два годика исполнилось на днях

Alexey
24.04.2018
09:06:29
Видимо бай дизайн промонали

Quantum Harmonizer
24.04.2018
09:06:55
Там три лайка. Значит, есть более приоритетные и критические задачи.

Andrew
24.04.2018
09:07:54
Пацаны, помог чем могу.

Alexey
24.04.2018
09:11:38
Там три лайка. Значит, есть более приоритетные и критические задачи.
Есть еще подозрение, что inline особо не пользуют люди, раз всем пофиг

Andrew
24.04.2018
09:14:33
https://github.com/JetBrains/kotlin/blob/master/spec-docs/reified-type-parameters.md Я не вижу упоминаний того, как reified должен влиять на вложенные типы. Есть какая-то мутная строчка в определении, что для дженерика каждый параметр тоже должен быть reified, но я пока ума не приложу, можно ли это как-то к вашей проблеме применить.

Sergey
24.04.2018
10:03:51
При этом +inline fun <reified T> c() = a<Array<T>>() + println(a<Array<Test>>()) +println(c<Array<Test>>()) class [LTest; class [LTest;
На самом деле ошибку можно воспроизвести проще: import java.lang.reflect.ParameterizedType import java.lang.reflect.Type abstract class TypeToken<T> inline fun <reified T> a() = ((object: TypeToken<List<T>>() {}).javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0] class Test fun main(args: Array<String>) { println(a<List<Test>>()) } Выведет: java.util.List<? extends T>

И, это видимо просто из за того что делали прагматично: org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt

нужно немного там поправить вроде )

Anton
24.04.2018
14:55:51
Слушайте, а при навигации по котлин-зависимостям к Intellij idea не показываются некоторые элементы навигации, например пин "Has subclasses". Это норма или настраивается?

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