Я знаю, что в C++ нет такой функции, как функция виртуальных шаблонов. Это связано с тем, что нам нужно знать записи в VTBL во время компиляции, и каждый тип шаблона компилируется отдельно.
Однако в Java я понимаю, что общий тип скомпилирован только один раз, который может включать переопределяющие методы общего класса. Это правда?
Если да, делает ли этот выбор дизайна?
В Java нет классов шаблонов. Вместо этого он имеет Generics, которые являются обычными классами Java, которые имеют дополнительную информацию о типе во время компиляции, что позволяет компилятору выполнять проверки безопасности типов. После выполнения этих проверок информация об общих типах "стирается", а скомпилированный класс выглядит как любой другой класс.
Любой не окончательный, не закрытый, не статический метод может быть переопределен в подклассе, независимо от того, является он общим или нет. Эта работа, потому что тип на самом деле является ссылкой в каждом случае. Когда вы меняете тип, вы просто меняете тип ссылки.
BTW Все нестатические методы являются "виртуальными" на Java.
final
). Взгляните наAbstractList<E>
для примера.