
Alexey
17.05.2018
13:47:03

Виталий
17.05.2018
13:48:22

Alexey
17.05.2018
13:48:49
?

Quantum Harmonizer
17.05.2018
13:49:05

Google

Quantum Harmonizer
17.05.2018
13:49:18
короче, матрицу же можно разложить в линию

Виталий
17.05.2018
13:49:43

Alexey
17.05.2018
13:50:14
Ну многомерные массивы в си, например, моделируются через одномерные, и сделано это, для перфоманса

Виталий
17.05.2018
13:50:21
в таблице типа путь искать по похожим ячейкам... там ад будет

Alexey
17.05.2018
13:50:53
Обернуть массив и написать нужный get не вариант типо?
RichArray(w: Int, h: Int) {
val arr: IntArray = IntArra(w * h)
fun get(x: Int, y: Int) ...
}

Виталий
17.05.2018
13:54:14

Alexey
17.05.2018
13:54:43
Если перфоманс не нужен, то впринципе пофигу

Виталий
17.05.2018
13:54:46
и потом
val r = RichArray(10,10)
r[1,1]

dimiii
17.05.2018
13:57:22
В соседнем чатике действует недельный запрет на флуд, так что вброшу здесь.
Моя внутренняя Ванга вангует в ближайшем будущем пачку языков, транслирующихся в гошечку, как тебе такое -Илон Маск- Андрей Бреслав?

Виталий
17.05.2018
13:57:24

Виталий
17.05.2018
13:58:17
медленнее чего?)

Google

Alexey
17.05.2018
13:58:38
А если это будут разные массивы, они будут разбросаны по хипу

Виталий
17.05.2018
13:59:07

Виталий
17.05.2018
14:00:37

Виталий
17.05.2018
14:00:48

dimiii
17.05.2018
14:01:59

Виталий
17.05.2018
14:02:00
Array(10, {intArrayOf(0))})
ну или там как то )) типа того

Alexey
17.05.2018
14:03:12

Виталий
17.05.2018
14:09:51
так не сделаешь)
Array(ROWS, { IntArray(COLUMNS, { 0 }) }) - все работает = заполняет нулями двумерный

Костя
17.05.2018
15:11:48
я не могу в Kotlin сделать так ?
fun <T : BaseViewModel> create(): T {
return SplashViewModel()
}
Пишет ошибку, что требует чтобы я в методе отдавал T, но я вроде и отдаю T, т.к. Т наследуются от BaseViewModel и SplashViewModel тоже..
что не так (

Жабра
17.05.2018
15:13:24

Костя
17.05.2018
15:15:25
мне кажется или так сделать нельзя просто, или я что-то не так написал в методе

Жабра
17.05.2018
15:15:41

Костя
17.05.2018
15:18:58
тут главный вопрос можно ли в котлин сделать дженерик метод, который будет отдавать разные типы у которых один суперкласс, можно отдавать типо суперкласс, но тогда на другой стороне придется вечно кастить, а хочется чтобы сразу шел нужный тип
можно ли вот вопрос

Жабра
17.05.2018
15:19:06

Костя
17.05.2018
15:19:16
так прокатит
но на выходе я буду иметь BaseViewModel

Google

Костя
17.05.2018
15:19:28
и нужно будет юзать каст
что неочень, собственно для этого и дженерики существуют
только вот не факт что в котлин так можно

Andrew
17.05.2018
15:20:03
А как вы вызываете метод-то? Вы ж обещаете вернуть T, а возвращаете SplashViewModel.

Костя
17.05.2018
15:20:28
а разве не так и нужно ?
оно должно понять что T наследуется от BaseViewModel
и я могу отдавать любого наследника внутри метода

Andrew
17.05.2018
15:21:08
Да нет, внутри метода вы должны отдать T или его наследника.

Костя
17.05.2018
15:21:09
а при вызове я в даймондах укажу тип, и он будет понимать что метод этот тип мне отдаст
ну так в java работает
чтобы был метод который отдает разные ViewModel наследуемые от одной
и на выходе не нужно юзать каст уже
а сразу нужный тип будет

Andrew
17.05.2018
15:22:16
Дык вы объясните человеческим способом, что вам надо. Я пока не понял, чего вы добиться пытаетесь, и почему у вас метод вроде как дженерик, а возвращает конкретный тип.

Жабра
17.05.2018
15:23:12

Andrew
17.05.2018
15:23:34
Вы-то при вызове укажете, что вы вместо <T> конкретное хотите, но тело метода это игнорирует.

Костя
17.05.2018
15:24:04
есть такая возможность ?
ну как я понимаю вопрос в том как сделать у метода возвращаемый тип == наследники BaseViewModel

Google

Костя
17.05.2018
15:26:05
любые, никакой конкретики

Boris
17.05.2018
15:26:14

Костя
17.05.2018
15:26:14
для этого ж и нужны дженерики

Andrew
17.05.2018
15:26:22
Суть с сигнатурой вы правильно уловили, fun <T: Base> method(): T, а вот с телом метода пока не очень. return Derived не сработает, ибо Derived в общем случае не наследник T.

Костя
17.05.2018
15:26:32

Va
17.05.2018
15:26:41
as T и не парься

Andrew
17.05.2018
15:26:59
Трудно дать более конкретный совет, ибо пока не ясно, как этот метод опирается на переданное снаружи T.

Boris
17.05.2018
15:27:05
а как
Просто надо возвращать тип, который заявлен в функции
А то как в том анекдоте, что ищу не там где потерял, а там где светло

Костя
17.05.2018
15:27:44
блин, значит я не умею объяснять

dimiii
17.05.2018
15:27:57
Ох вей

Andrew
17.05.2018
15:28:17
У вас просто упрощённый пример оказался слишком упрощённым. Поясните суть вашего create, как он использует на деле T.

Жабра
17.05.2018
15:28:34

Boris
17.05.2018
15:28:34
Если т сделать рефайд и потом т::класс.ньюинстанс, то будет норм

Костя
17.05.2018
15:29:21
val viewModel = ViewModelProvider.create<SplashViewModel>(SplashViewModel::class.java)
к примеру так
и viewModel : SplashViewModel
не BaseViewModel
для других viewModel аналогично

Google

Костя
17.05.2018
15:30:01
ну для всех в принципе )
внутри метода будет when который будет смотреть входной типо и создавать объект и отдавать

Boris
17.05.2018
15:31:18
inline fun <reified T:Any> create(): T = T::class.java.newInstance() вот такой код будет работать

Костя
17.05.2018
15:31:21
в идеале если бы он мог вообще сразу на T смотреть
у inline нету подводных камней ? минусов каких, не юзал ещё толком, суть примерно ясна, что код встраивается по итогу в место вызова )

Andrew
17.05.2018
15:32:17
Если вы вяжитесь на JVM, то внутри <reified T: BaseViewModel> и return T::class.newInstance(), как выше верно подсказали, а по уму он должен иметь фабрики этих ваших наследников от BaseViewModel.

Boris
17.05.2018
15:32:36
есть подводные камни, но по-другому к Т доступа в рантайме не получить

Andrew
17.05.2018
15:33:31
Можно просто явно параметром в метод передавать KClass<T>, тогда inline не нужен.

dimiii
17.05.2018
15:33:46

Костя
17.05.2018
15:34:36
но используются же фабрики и т.д. для создания объектов
а не просто конструторы дергаются у каждого и всё, внутри они же и дергаются, да

Andrew
17.05.2018
15:35:46
Правильно, фабрики позволяют убрать вызов конструктора в место, которое точно знает тип, а не использовать newInstance.

Boris
17.05.2018
15:36:44
фабрики они абстрагируют обычно конкретный тип, а тут ты создашь именно тот Т который ты знаешь при вызове. Возможно там проще будет написать что-то типа
val viewModel = ViewModelProvider.create<SplashViewModel>(SplashViewModel())

Костя
17.05.2018
15:36:46

Andrew
17.05.2018
15:36:58
Где-то в одном месте ставится соответствие KClass<X> -> способ создать объект типа X, а потом эти ваши методы вроде create обращаются к зарегистрированным фабрикам.

Жабра
17.05.2018
15:37:22
Щас накопал про Inline properties
https://kotlinlang.org/docs/reference/inline-functions.html
Это что вообще такое? (о.о)

Andrew
17.05.2018
15:37:24
Об этом, собсна, все эти даггеры и прочие.

Костя
17.05.2018
15:38:02

Andrew
17.05.2018
15:38:11
Т.е. сахарок над методами get и set.
Почему бы их и не инлайнить при надобности.

Костя
17.05.2018
15:38:23
тогда как лучше вынести такой create или сделать, чтобы он был как фабричный метод