Size: a a a

Kotlin Community

2020 December 30

AN

Alexander Nozik in Kotlin Community
А где реализация-то будет? Все равно тебе надо на каждый A реализацию делать
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Nozik
А где реализация-то будет? Все равно тебе надо на каждый A реализацию делать
не надо же. потому что BufferFactory дает метод new от произвольного типа
источник

AN

Alexander Nozik in Kotlin Community
Iaroslav Postovalov
не надо же. потому что BufferFactory дает метод new от произвольного типа
Не может. В принципе. Он должен знать, что инстанцировать. Значит где-то это должно быть прописано.
источник

ВМ

Валерий Маевский... in Kotlin Community
немного отвлечённый вопрос
sealed class A { class B: A; class C: A; class D: A }
и when (a) { is B -> fB(a); is C -> fC(a); is D -> fD(a) }
работает так же быстро, как
abstract class A(val tp: Int) { class B: A(1); class C: A(2); class D: A(3) }
и when (a.tp) { 1 -> fB(a as B); 2 -> fC(a as C); 3 -> fD(a as D) }
?
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Nozik
Не может. В принципе. Он должен знать, что инстанцировать. Значит где-то это должно быть прописано.
а ему и не нужно ничего инстанцировать, т.к.:
interface BufferFactory<A<_> : Buffer<_>> {
 fun <T> new(size: Int, init: (Int) -> T): A<T>
}
источник

AN

Alexander Nozik in Kotlin Community
Валерий Маевский
немного отвлечённый вопрос
sealed class A { class B: A; class C: A; class D: A }
и when (a) { is B -> fB(a); is C -> fC(a); is D -> fD(a) }
работает так же быстро, как
abstract class A(val tp: Int) { class B: A(1); class C: A(2); class D: A(3) }
и when (a.tp) { 1 -> fB(a as B); 2 -> fC(a as C); 3 -> fD(a as D) }
?
Что такое "работает быстро"? Перебор по типам очень шустрый на JVM. На JS не очень
источник

AN

Alexander Nozik in Kotlin Community
Iaroslav Postovalov
а ему и не нужно ничего инстанцировать, т.к.:
interface BufferFactory<A<_> : Buffer<_>> {
 fun <T> new(size: Int, init: (Int) -> T): A<T>
}
Так тебе все равно где-то надо к каждому A и Т где-то конструктор сопоставить. Хоть в имплиситах, хоть где
источник

ВМ

Валерий Маевский... in Kotlin Community
во втором случае это вроде tableswitch на jvm
в первом непонятно
источник

AN

Alexander Nozik in Kotlin Community
Валерий Маевский
во втором случае это вроде tableswitch на jvm
в первом непонятно
Такие вещи оптимизировать без острой нужды и явных замеров очень-очень не рекомендуется
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Nozik
Так тебе все равно где-то надо к каждому A и Т где-то конструктор сопоставить. Хоть в имплиситах, хоть где
нужно, да
источник

IP

Iaroslav Postovalov in Kotlin Community
т.к. нужно реализовать BufferFactory через Companion каждого конкретного буфера
источник

AN

Alexander Nozik in Kotlin Community
Iaroslav Postovalov
нужно, да
Воот. Суммарный объем кода будет ровно тот же самый. Разница только в том, что у нас надо явно фабрику передать, а с имплиситами они к типу байндятся. Одно слово разницы.
источник

IP

Iaroslav Postovalov in Kotlin Community
но внешне оно выглядит полиморфно и тайпсейфно
источник

AN

Alexander Nozik in Kotlin Community
Iaroslav Postovalov
но внешне оно выглядит полиморфно и тайпсейфно
И если у тебя две фабрики на один тип, упс.
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Nozik
И если у тебя две фабрики на один тип, упс.
то можно просто проименовать их и держать в разных переменных?
источник

IP

Iaroslav Postovalov in Kotlin Community
class ListBuffer<T> {
 companion object {
   val A = BufferFactory<ListBuffer<_>> { ... }
   val B = BufferFactory<ListBuffer<_>> { ... }
 }
}
источник

AN

Alexander Nozik in Kotlin Community
Iaroslav Postovalov
то можно просто проименовать их и держать в разных переменных?
Не, погоди. По типу же биндится. Это тебе надо на каждый чих ньютайпы тогда платить. Если биндится не по типу, а явной подстановкой, то оно и так уже работает.
источник

IP

Iaroslav Postovalov in Kotlin Community
Alexander Nozik
Не, погоди. По типу же биндится. Это тебе надо на каждый чих ньютайпы тогда платить. Если биндится не по типу, а явной подстановкой, то оно и так уже работает.
так оно в любом случае биндится через компаньон
источник

IP

Iaroslav Postovalov in Kotlin Community
который по сути просто переменная
источник

AN

Alexander Nozik in Kotlin Community
Iaroslav Postovalov
так оно в любом случае биндится через компаньон
Тогда опять не понял, причем тут хкт. Ладно, пока отложим, работать надо.
источник