Сколько видов полиморфизма в Java?

💡 Усі статті, обговорення, новини про Java — в одному місці. Приєднуйтесь до Java спільноти!

Всем привет.

Недавно коллега проходила собеседование и ей задали вопрос: сколько видов полиморфизма в Java? Ответить она не смогла. По своей памяти я помню только 2 вида полиморфизма.

Интересно ваше мнение, форумчане)) Сколько же на самом деле видов полиморфизма и на сколько корректна сама постановка вопроса?

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

На этот вопрос можно сказать один ) И это позднее связывание) насчёт статической что писали это ранее связывание, и оно не относится к данному вопросу. Я бы лучше на такой вопрос с подь*ебом задал встречный, отвечу только после того как вы ответите на мой вопрос что бы я понимал вашу компетентность в данном вопросе, чем отличается ранние связывание от позднего. И точка))))Если ответит то можно смело отвечать то что написано выше)

Насколько я понимаю, существует только один вид полиморфизма — параметрический (разних порядков, впрочем). Есть ещё ad-hoc, но это абстракция, а не полиморфизм. Есть ещё «полиморфизм наследования», т.н. overriding — который есть плохо реализованый ad-hoc позднего связывания. И overriding, который вообще странно называть полиморфизмом, т.к. типы разные, и разные реализации, ничего общего, кроме имени.

Ну ладно, есть еще сабтайпинг aka equi-рекурсия, ок. И row-полиморфизм (но не в жабе :P) туда же.

*2й раз имелся в виду overloading, ес-но.

Полиморфизм — это полиморфизм.

Overloading & Overriding

Это то что он делает. Все что «ing» — это действия.
Перегружают и переопределяют, можно еще добавить Overmethodeasing, Overtimesaving, Overcodeshorting. И что от этого поменяется?

Ведь все, что делает Полиморфизм — это уже плюсы его использования ;)

И оба не являются полиморфизмом =P

«Полиморфизм» = «поли» + «морф». «Поли» — много.

Морф — часть слова Ксеноморф. Ксеноморфы — кремниевая форма жизни. Компьютеры — это ксеноморфы.

Компьютеры — комп + ютер — компют это считать/рассчитывать, ютер = юзер — пользователь. Считать пользователей. Вывод — компьютеры за нами следят.

А с тех пор много новых появилось?

Вот помню были только ивенты, и их всегда ивентами называли. Потом стало скучно Каждую свиселку или перделку для ивента стали называть эриксшото, реактившотою, асюнкшото, а по сути ивенты. Вот уже и до полиморфизма добрались. Это какая-то дрисня головного мозга.

Вот вам небольшой ремикс)

Вот помню были только переходы, и их всегда переходами называли. Потом стало скучно. Каждую свиселку или перделку для перехода стали называть условиешото, функошото, цыклошото, а по сути переходы. Вот уже и до полиморфизма добрались. Это какая-то дрисня головного мозга.

никогда только переходов не было. есть jmp & call

Хех глянул ассемблер оказывается условными были (почему «были»?) не только jmp но и такие же ж варианты и для call и для return.

не, ну есть еще loop & ret с подсунутым в стэк нужным адресом

Только в 8086 появилась loop как комбинация dec cx и jnz в одной инструкции.

ЗЫ: причём я ещё и помню что делается через CX а в 8080 CX же ж нет вот думаю странно а как же ж они в таком случае loop делают? ))

Ой не во всякой архитектуре.

Если уж на то пошло, есть ещё переход по вектору прерывания int и возврат из обработчика прерывания iret.

Еще помню был себе char, a потом как понеслось, std::string, CString(T), BSTR(_t), wchar(_t) (уверен что еще какие-то забыл).... и тонна конвертеров этого всего друг в друга. Это какая-то дрисня головного мозга.

QString забыли
и вообще «Еще помню был себе char*» правильнее

Причём был signed и unsigned ))

Ну звездочку можно там пределать вообще ко всему.

Вот из-за вопросов поставленных подобным образом страна и в ..опе

Это не жопа, а реформаторский полиморфизм

сколько видов реформаторского полиморфизма в жопе?

По 1 с левой резьбой на любую хитрую

правильный ответ — «незнаю»
ибо ну его нафиг этот бред обсуждать

Не «незнаю», а «тебе какое дело?», чего уж там.

Правильный ответ «а мы покупаем или продаём»?

Вопрос дебильный, но иногда дебильные вопросы задают не потому что сами дебилы, а потому что им интересно понаблюдать за ходом мыслей кандидата. Так что сразу нах я бы не слал.
Сначала можно сказать, что два: статический и динамический. Если такой ответ не устроит — пусть сами задают уточняющие вопросы.

дебильные вопросы задают не потому что сами дебилы

Оптимист :)

правильный ответ: «достаточно»

Да ладно, и higher kinded, и row-polymorphism есть?

Правильный ответ на такой вопрос — давай до свиданья.

Ровно столько, сколько написано в «единственно верной» методичке интервьюера. Правильный ответ — сколько надо, столько и будет.

Как правило, программисты Java вообще не сталкиваются с необходимостью его программировать или даже иметь в виду, ровно до тех пор пока не понадобится писать свой протокол сериализации. Большинству это не понадобится никогда, есть готовые библиотеки (в том числе в самой жабе), со своим API

Мой совет: после вопроса «сколько видов» произнести «ПНХ», встать и уйти с собеса. Потому что в случае принятия вы будете работать в команде недомерков, которые 0.3+0.3 не сложат без рантайм-эррора, зато знают сколько видов чисел с плавающей точкой и как посчитать количество элементов массива через Stream API.

Коментар порушує правила спільноти і видалений модераторами.

Надо было коллеге задать наводящие вопросы, что конкретно имел ввиду собеседующий. Собеседование — это не вопрос-ответ, это общение двух профессионалов на общую тему.

— Скажите, студент, а знаете ли Вы что такое экзамен?
— Знаю.
— Hу и что это такое?
— Это разговор двух умных людей.
— Hу а если один из них дурак?
— Тогда второй не получит стипендию.

собеседование это беседа двух умных людей. -а если один из них идиот? -тогда другой не получит работу

отвечать на подобные вопросы нужно, рассуждая вслух на заданную тему, а не пытаясь «угадать» правильный ответ. Вот в комментариях — правильный ответ, вне зависимости от точки зрения интервьюера

Их может быть сколько угодно: один правильный и ... любое число ... неправильных.

Вполне себе корректный вопрос. Практической ценности от него я не вижу, правда, но почему бы и нет :-)

P.S. Статический (перегрузка методов) и динамический (overriding).

В принципе да, параметрический полиморфизм имеет место быть.

Нету его в Яве, в Яве нет параметрического полиморфизма, генерики это просто синтаксический сахар. Параметрический полиморфизм в С++, он не так работает.

i++ или foreach — это синтаксический сахар, а дженерики решают вполне конкретную проблему.

Как бы да, только два по идее.

На этот вопрос есть два ответа: который «знает» интервьюер из курсов, и неправильный. А спрашивает именно это — не потому что есть практическая цель, а потому что это проще спросить.

оп-па... а перегрузка методов это полиморфизм?

Если мы говорим о Java — то несомненно. Программист сводит несколько похожих методов с разными параметрами к одному имени. Дальше он может вызывать лишь один метод по имени, а компилятор будет выбирать подходящую реализацию этого метода в зависимости от типа аргументов и их количества. Один интерфейс, несколько методов. На Ваш взгляд, это не полиморфизм?

На Ваш взгляд, это не полиморфизм?

Нет, разумеется. Т.к. несколько методов с разными сигнатурами — не являются «единым интерфейсом».

П.С. Хотя, глянул сейчас — таки считают перегрузку функций/операторов формой статического полиморфизма. Куда катится мир...

А в джаве статическая типизация или динамическая?

Тип функции (метода) определяется во время компиляции, а не в рантайме. Т. е. статическая.

Чёрт а ведь так просто и не подкопаешься таки по факту «синтаксический полиморфизм» (к) (тм)

«синтаксический полиморфизм» — крутейшее определение, добавлю в копилку :-)

по факту «синтаксический полиморфизм»

«Синтаксический полиморфизм» — то другое. Когда ещё болъше хипстеров и прочих географов набегут в индустрию — определение расширят для них так: «функции являются полиморфными, если их названия различаются не более, чем в одной букве».

Это и будет «синтаксический полиморфизм».

Ну как бы да но по факту записи равнозначны:

a.f1();
b.f1();

f1(a);
f1(b);

В таком случае вопрос подразумевает ли полиморфизм диспетчиризацию и если таки да то что в таком случае тот самый «статический полиморфизм»?

Может в таком случае надо таки другое слово?

подразумевает ли полиморфизм диспетчиризацию

В разнице "динамический"/"статический«, речь идёт лишь о байндинге функций. В «статическом» случае, байндинг «ранний» на этапе компиляции. В «динамичсеком» — «поздний», в рантайме.

Ок не вопрос давай тогда определяться что есть «байдинг функций».

ЗЫ: где-то был здесь на доу вопрос на двойную диспетчиризацию кстати я даже придумал своими руками (ну придумал головой ок) как это таки сделать )) оказалось не первый но таки же ж придумал «как есть».

двойную диспетчиризацию

Это, вроде, вообще из другой оперы. Типа, пользование мелкомягкими «ком»-объектами нативно (через IUnknown) или через т.н. «дисп-интерфейс» (IDispatch).

Не то ерунда имеется в виду возможность вызова функции конкретного типа параметра при этом определяя ещё вызов через реальный тип экземпляра-параметра при условии common call с параметром общего типа.

Типа:

T1 : from T0;
T2 : from T0;
f1(T1 p);
f1(T2 p);
=>
T0 u = new T1;
call f1(u) => means f1(T1)

Причём перейдя на ООП и вынеся f1(...) в методы оно же ж автоматически да?

virtual T0::f1() = 0;
T1::f1();
T2::f1();
=>
T0 u = new T1;
call u->f1() => means T1::f1() voilà!

T0 u = new T1;
call f1(u) => means f1(T1)
T0 u = new T1;
call u->f1() => means T1::f1() voilà!

Ну да. Это всё динамический полиморфизм.

... и по факту вызов f1() таки диспетчеризируется куда надо.

В жабе есть class loader, который тебе и чёрта с рогами может наворотить, особенно если он сторонний. Вплоть до подмены того самого лоадера на живой жабе.

Эм, с такой логикой можно вообще наличие разных функций — тоже назвать полиморфизмом! Программист сводит несколько похожих методов с разными параметрами и именами. Дальше он может вызвать лишь один метод, а компилятор будет выбирать подходящую реализацию в зависимости от имени и аргументов...

а компилятор будет выбирать подходящую реализацию в зависимости от имени и аргументов...

Ну а чем же ж не полиморфизм времени компиляции ))

Да-да, Стратегия и Фабрика — тоже полиморфизм, более высокого уровня :)

Перегрузка методов — это перегрузка методов. А полиморфизм — это из философии, ему место там же где и прочим измам — в книжках «для гуманитариев». В реальности полиморфизма нет, есть перегрузка методов, и ещё 100500 способов приведения написанного буквами в машинный код.

Тем не менее использование одной и той же сигнатуры функции для разных типов аргументом с разным телом функции называется «ad hoc полиморфизм» в куче источников, и спорить с этим можно только выдвигая причины отвержения такого названия.
И параметрический аналогично — то же вроде бы перегрузка, но зовётся полиморфизмом.

Само понятие «полиморфизм» нужно только для описании идеи с целью преподавания. Никаких других функций данный термин выполнить не может. И это нормально, когда слову принадлежит простая категория, простой шаблон — это упрощает понимание языка.

Конкретику нужно рассматривать только тем, кто собирается это всё активно использовать с намерением влезть в системные процессы. Например, высший пилотаж в HighLoad требует знания этих механизмов. А прикладное программирование — никогда.

Что такое сигнатура? Просто данные идентификации, вот и всё. Если там есть возможность подмены, это уже полноценный механизм связывания, который работает по принципу чёрного ящика, и на его изучение надо потратить туеву хучу времени — и только тем кому надо.

Львиная доля полиморфизма осуществляется компилятором — и он сменит сигнатуру как младая дева мечтами лёгкие мечты. По той лишь причине, что у него туева хуча таблиц этих сигнатур на разную степень асбтракции. Равно как и рантайма их тоже так некисло. А уж сборщик мусора.... его полиморфизму Верховный суд позавидует.

наверное можно и к подстановке лямбды притянуть за уши понятие полиморфизм и тогда уже 4 вида будет

Підписатись на коментарі