Size: a a a

Kotlin Community

2020 July 08

OY

Oleg Yukhnevich in Kotlin Community
М R
давайте больше контекста дам, у меня вот такой event bus работает на этом.
И закрывать канал не получится просто так, так как нужно закрывать его, когда отменяется подписка, а об этом знает только место вызова.
class Bus<T> {
   private val channel: BroadcastChannel<T> = BroadcastChannel(1)

   fun content(): Flow<T> {
       return channel.openSubscription().receiveAsFlow()
   }

   fun setValue(value: T) {
       channel.offer(value)
   }
}
для этого будет SharedFlow с reply=0, если я понимаю правильно
источник

МR

М R in Kotlin Community
Oleg Yukhnevich
для этого будет SharedFlow с reply=0, если я понимаю правильно
к сожалению, его пока нет
источник

AM

Andrew Mikhaylov in Kotlin Community
Ayrat Hudaygulov
ex as E жалуется на unchecked cast
Ну так вам приходит какое-то исключение, а вы егок конкретному типу скастить пытаетесь 🤷‍♂ Чего вы ожидаете от
foo<IOException>(ClassCastException(...))?
источник

AH

Ayrat Hudaygulov in Kotlin Community
Andrew Mikhaylov
Ну так вам приходит какое-то исключение, а вы егок конкретному типу скастить пытаетесь 🤷‍♂ Чего вы ожидаете от
foo<IOException>(ClassCastException(...))?
да, я тут подумал и понял что это я глупость сделал
источник

AM

Andrew Mikhaylov in Kotlin Community
Ayrat Hudaygulov
да, я тут подумал и понял что это я глупость сделал
Нет, это необязательно глупость, если вы действительно каким-то способом предварительно (например, до вызова этого метода) проверили, что исключение нужного вам типа, и в теле метода уверены в этом. Но даже в этом случае вам явно придётся unchecked cast-ом в этом убеждать компилятор.
источник

AH

Ayrat Hudaygulov in Kotlin Community
Andrew Mikhaylov
Нет, это необязательно глупость, если вы действительно каким-то способом предварительно (например, до вызова этого метода) проверили, что исключение нужного вам типа, и в теле метода уверены в этом. Но даже в этом случае вам явно придётся unchecked cast-ом в этом убеждать компилятор.
я себя не смог убедить что это правильно, компилятор даже не буду пытаться)
источник

AM

Andrew Mikhaylov in Kotlin Community
:)
источник

AH

Ayrat Hudaygulov in Kotlin Community
как портануть вот такой код со скалы в котлин?
classOf[A[B]]


Условный A<B>::class.java не работает с ошибкой
Only classes are allowed on the left hand side of a class literal
источник

AN

Alexander Nozik in Kotlin Community
Ayrat Hudaygulov
как портануть вот такой код со скалы в котлин?
classOf[A[B]]


Условный A<B>::class.java не работает с ошибкой
Only classes are allowed on the left hand side of a class literal
typeOf
источник

AN

Alexander Nozik in Kotlin Community
Только по-моему до 1.4 нельзя его в джавовый класс сконвертировать
источник

AH

Ayrat Hudaygulov in Kotlin Community
почти взлетело. Теперь надо KType в java.lang.Class конвертнуть
источник

AL

Alexander Levin in Kotlin Community
Ayrat Hudaygulov
почти взлетело. Теперь надо KType в java.lang.Class конвертнуть
Я возможно туплю, но если вам нужен конкретно java.lang.Class, то не подойдёт просто сделать A::class.java? Там вроде в таком представлении нету информации о дженерике
источник

AH

Ayrat Hudaygulov in Kotlin Community
Alexander Levin
Я возможно туплю, но если вам нужен конкретно java.lang.Class, то не подойдёт просто сделать A::class.java? Там вроде в таком представлении нету информации о дженерике
Не работает
A<B>::class.java
источник

RI

Ruslan Ibragimov in Kotlin Community
java.lang.Class для  A<B> будет просто A 🙂
источник

AN

Alexander Nozik in Kotlin Community
Ayrat Hudaygulov
почти взлетело. Теперь надо KType в java.lang.Class конвертнуть
А как вы хотите конертировать если у вас type erasure. Это и в скале не должно работать
источник

AL

Alexander Levin in Kotlin Community
Ayrat Hudaygulov
Не работает
A<B>::class.java
Именно A::class.java, без дженерик параметра.
источник

AH

Ayrat Hudaygulov in Kotlin Community
Понимаю. Но это для флинка. А флинк сохраняет типы в метадате чтобы потом можно было десериализовать месаджи с генерик параметром между нодами
источник

RI

Ruslan Ibragimov in Kotlin Community
Значит должен быть API с Type
источник

AH

Ayrat Hudaygulov in Kotlin Community
что там делает скала компилятор не очень ясно, но classOf[A[B]] будет перекинут на другую ноду и флинк будет знать что это именно A[B]
источник

AN

Alexander Nozik in Kotlin Community
Ayrat Hudaygulov
Понимаю. Но это для флинка. А флинк сохраняет типы в метадате чтобы потом можно было десериализовать месаджи с генерик параметром между нодами
Я не знаю, что такое флинк. Но скаловая метадата работать не будет, используете тогда котлиновский Type без джавового класса, он как раз в метадате сохраняется
источник