Здравствуйте, aka50, Вы писали:
A>Здравствуйте, mkizub, Вы писали:
M>>Посмотри на код, генерируемый Scala и ужаснись.
A>Покажи... вот честно, интересно... а то пока только пугаешь (есть там конечно кривости, но как это сделать иначе я тоже не сильно представляю)
M>>Или вот, пусть мне нужны параметры типов в рантайме. Чтоб я мог написать
M>>List<String> ls = ...;
M>>String[] arr = ls.toArray();
M>>а не
M>>String[] arr = ls.toArray(new String[ls.size()]);
A>Вообще-то разработчику vm должно быть стыдно, если он не знает почему именно требуется объект массива
Устыди. Я не понял где мне стыдится. Я знаю, что он требуется в яве. А в моем комплиторе он не требуется.
A>на scala это решается безо всяких прыжков:
A>scala>> val ls = 1 :: 2 :: Nil
A>ls: List[Int] = List(1, 2)
scala>> ls.toArray
A>unnamed1: Array[Int] = [I@4854f6 << обрати внимание, что тут именно нейтив массив, а не boxed
A>
A>Код в самой скала самый обычный:
A>A>override def toArray[B >: A]: Array[B] = {
A> val result = new Array[B](size)
A> copyToArray(result, 0)
A> result
A>}
A>
A>Другой вопрос, когда мы хотим что-то такое, но это уже спасибо блин erasure...
A>A>class MyType[T] {
A> def oops = new T()
A>}
A>
Я же сказал — в рантайме. А рантайме типы нужны. А ты опять про erasure.
Я не знаю, как в Scala сделан List[Int].toArray, но он не может этого делать
без инлайнинга или передачи спрятанных параметров в метод. Чудес не бывает.
Откуда-то метод toArray должен узнать тип массива. И поскольку в Scala эти
типы отрезаются компилятором — то только один из предложенных вариантов — хранить
в самом List (передача параметра во время создания списка) и передавать
параметр во время вызова toArray. Других вариантов просто нет.