Прохрамисты здесь? Вот давай, без компилятора, скажи че будет выведено на экран. Три метода в классе Processor. Метод run() в классе ideone. Метод run() в main вызывается с стригом "строка". Что будет выведено на экран? Загадка.
>>212211550Объект - это более абстрактная сущность, чем строка. Т.е. любая строка является также и объектом, но не с любым объектом можно работать как со строкой.
>>212211799Допустим у нас в объекте Стринг был бы переопределен метод какой-нибудь. Пусть .getClass() возвращает у стринга "Что-то". Мы можем у o.getClasss() вызывать? Или если там тип Обжект, то и методы Стринга не доступны?
>>212212032Я хз как в джаве, на C# пишу. Но в шарпе ты можешь принудительно представить любой объект как экземпляр конкретного класса, а если привести не получилось - будет null:object Obj = "test";string Str = (Obj as string).ToUpper(); // TESTArray Arr = (Obj as Array); // null
Ну-ка товарищи погромисты без вставки в компилятор угадайте что делает код: while (true) { for ($k = $directionNORTH; $k < $cols - $directionSOUTH; $k++) { $arr[$k][$directionEAST] = $fill; } $directionEAST++; $step++; if ($step == $maxsteps) break; for ($k = $directionEAST; $k < $rows - $directionWEST; $k++) { $arr[$cols - 1 - $directionSOUTH][$k] = $fill; } $directionSOUTH++; $step++; if ($step == $maxsteps) break; for ($k = $cols - 1 - $directionSOUTH; $k >= $directionNORTH; $k--) { $arr[$k][$rows - 1 - $directionWEST] = $fill; } $directionWEST++; $step++; if ($step == $maxsteps) break; for ($k = $rows - 1 - $directionWEST; $k >= $directionEAST; $k--) { $arr[$directionNORTH][$k] = $fill; } $directionNORTH++; $step++; if ($step == $maxsteps) break; }}
>>212214540Ты долбоеб? Как можно предсказать, что выведет на экран рандомный псевдокод, не зная какой компилятор/интерпретатор будет его обрабатывать? Может вообще будет ошибка синтаксиса.
Мы передаем в метод ран() ссылку на строку. Почему когда вызываем процесс с ссылкой на строку, не вызывается метод для строки? Почему, блять?
ObjectStringв первом случае вызывается перегрузка для Object, т.к. компилятор при компиляции функции run знает только то, что тип переменной o -- Object. А то, с каким именно аргументом вызывалась функция run, ему во время генерации кода run по барабану./thread
>>212215838>т.к. компилятор при компиляции функции run знает только то, что тип переменной o -- Object.Но чому? Чому он не видит, что ссылка ведет на стринг?
>>212216405Ещё раз.Компилятор компилирует функцию run.Он не смотрит на вызовы этой функции от слова совсем.Потому что если бы он это делал, то при наличии косвенной рекурсии (функция foo вызывает bar, а та зовёт foo) ему не удалось бы завершить компиляцию. Да это и не требуется.Так работает статическая типизация.Итак, компилятор компилирует функцию run. А в ней тип o -- Object. Ну вот и в соответствии с этим знанием он выбирает ту перегрузку, которая является наиболее подходящей, и выполняет связывание.
>>212216850Как компилято определяет какие функции надо компилировать, а какие нет? Типа для компилятора вызова функции и сама функция имеют разницу?
>>212217496Потому что компилятор, когда компилирует run(Object o), не делает никаких предположений о том, какой в действительности будет тип o. Ему приказано [тобой] сгенерировать код, который умеет обрабатывать Object. Он послушно выполняет. На выходе мы имеем код функции, который не зависит от фактических аргументов.Это в целом важная концепция. А именно: различие между формальными и фактическими аргументами функции.Формальные -- те, которые в сигнатуре описаны.Фактические -- те, которые действительно переданы в функцию.
>>212217919Это компилируется отдельно и независимо от тела функции run(). Вызов run("строка") компилируется в контексте компиляции функции main().
>>212218062И при компиляции он не проверяет что ли ничего? Можно такой тип передавать, нельяз? Проверяет же. И все равно лезет к телу функции для проверки.
>>212218343Он не лезет в тела используемых функций.Он проверят лишь сверяясь с сигнатурами используемых функций.
>>212218406А как мне читать код? Постоянно дежать в голове как этот метод будет компилирован компилятором что ли? Может есть какие-то лайфхаки?