Ранее я уже высказывал такую концептуальную претензию к языку Java, и на днях снова сплясал по этим граблям.
Синтаксис Java слишком много взял от C++. Якобы для того, чтобы программисты на С++ (точнее, те, кто ничего, кроме С++ не признаёт и не понимает) переходили на Java легко и непринуждённо. Однако при этом в те же одежды синтаксиса порой рядится существенно иная тушка семантики.
На днях я порадовался об обобщённые (универсальные, генерики) методы и классы. Синтаксис мимикрирует под шаблоны C++, однако принципиальное отличие (если я всё верно понял) в том, что генерик-то компилируется ровно один раз и полностью обходится только тем, что ему на тот момент известно, в то время как шаблон на момент инстанцирования знает всё о типах параметров шаблона. Например, может вызвать конструктор объекта типа T (где T - параметр шаблона), обратиться к его статическим полям и методам и т.д.. В случае же джавы этого ничего нет.
И потом, имея, например несколько строк кода, однотипного для двух десятков мелких классов, и использующего в одном месте выражение вида MyClass.class, я, если хочу заменить их обобщённым методом, должен этот самый MyClass.class передавать ещё одним параметром в обобщённый метод. Хотя, казалось бы, из типа использованных параметров ясно, какой там класс в каждом конкретном вызове. (И подумалось, что вообще-то потребность в этом параметре известна на момент компиляции генерика, и он может потребовать, чтобы ему этот параметр при вызове неявно передавали, избавляя человека от лишней писанины.)
В итоге: с одной стороны, подобие синтаксиса снизило порог вхождения, избавив меня по началу от детального чтения того, что такое генерики и как они работают (а строгость языка не позволила мне применить его так, как он не умеет). С другой стороны, потребовалось два раза потанцевать по этим граблям (первый был попроще и не так много времени отнял), чтобы осознать, что этот уж вовсе не уж, а ёж, что механизм совсем иной и сиплюсплюсные представления о шаблонах лучше отложить и врюхать в механизм генериков детально.
В общем, моя претензия к джаве в неоправданной мимикрии под C++ лишь окрепла.
This entry was originally posted at
https://arilou.dreamwidth.org/1001535.html. Please comment there using
OpenID.