Ответ 1
Templates, как в С++, не существует в Java. Наилучшее приближение generics.
Одно огромное различие заключается в том, что в С++ это законно:
<typename T> T sum(T a, T b) { return a + b; }
В Java нет эквивалентной конструкции. Лучшее, что вы можете сказать,
<T extends Something> T Sum(T a, T b) { return a.add(b); }
где Something
имеет метод, называемый add
.
В С++ происходит то, что компилятор создает скомпилированную версию шаблона для всех экземпляров шаблона, используемого в коде. Таким образом, если мы имеем
int intResult = sum(5, 4);
double doubleResult = sum(5.0, 4.0);
тогда компилятор С++ скомпилирует версию sum
для int
и версию sum
для double
.
В Java существует понятие erasure. Что происходит, так это то, что компилятор удаляет все ссылки на параметры типового типа. Компилятор создает только одну скомпилированную версию кода независимо от того, сколько раз он используется с разными параметрами типа.
Другие различия
- С++ не позволяет ограничивать параметры типа, тогда как Java делает
- С++ позволяет параметрам типа быть примитивами, тогда как Java не
- С++ позволяет шаблонам ввести параметры, имеющие значения по умолчанию, где Java не
- С++ позволяет специализацию шаблона, тогда как Java не И, как и следовало ожидать к этому моменту, С++-стиль метапрограммирование шаблона невозможно с помощью дженериков Java.
- Забудьте о просмотре любопытно повторяющегося шаблона шаблона в Java
- Политический дизайн невозможно в Java