Я знаю немного, как использовать С++ - Шаблоны - не эксперт, заметьте. С Java Generics (и Scala, если на то пошло), у меня есть свои разнородности. Возможно, потому что я пытаюсь перевести свои знания на С++ в мир Java. Я читал в другом месте, "они ничем не похожи друг на друга: Java Generics - это синтаксические сакральные сбережения, С++ Templates - только прославленный препроцессор": -)
Я уверен, что оба упрощают представление. Итак, чтобы понять большие и тонкие различия, я пытаюсь начать с специализации:
В С++ я могу создать Template (класс функции), который действует на любой тип T
, который поддерживает мои требуемые операции:
template<typename T>
T plus(T a, T b) { return a.add(b); }
Теперь это потенциально добавляет операцию plus()
к любому типу, который может add()
. [note1] [1]
Таким образом, если T
поддерживает add(T)
мой шаблон woll work. Если это не так,
Компилятор не будет жаловаться, если я не использую plus()
. В Python
мы называем это "утиным языком": * Если он действует как утка, трясины, как утка,
это утка. * (Конечно, с использованием type_traits это немного изменено,
но пока у нас нет понятий, так работают С++ Templates, верно?)
Я предполагаю, что как работает Generics в Java, не так ли? Обычное устройство типа я используется в качестве "шаблона", как действовать на все, что я пытаюсь установить там, не так ли? Насколько я понимаю, я могу (или должен?) Поместить некоторые ограничения в аргументы типа: Если я хочу использовать add
в своем шаблоне, я должен объявить аргумент типа implement Addable
, Верный? Итак, нет "утиной печати" (лучше или хуже).
Теперь, в С++, я могу выбрать specialize для типа, у которого нет add()
:
template<>
T plus<MyX>(MyX a, MyX b) { return a + b; }
И даже если все остальные типы по-прежнему могут использовать реализацию по умолчанию, теперь я добавил специальный для MyX
- без накладных расходов во время выполнения.
Есть ли какой-либо механизм Java Generics, который имеет ту же цель? Конечно, в программировании все выполнимо, но я имею в виду концептуально, без каких-либо трюков и магии?