Это шаблон, который можно применять к любому языку, при условии, что язык был написан в среде, которая позволяет переназначать имена, связанные с блоками кода.
В компьютере код и данные находятся в памяти. В языках программирования мы используем имена для обозначения этих «кусочков» памяти.
int a = 0;
"назовет" некоторое количество байтов памяти "a". Это также «присвоило бы» этой памяти значение байта, соответствующее 0. В зависимости от системы типов,
int add(int first, int second) {
return first + second;
}
будет "называть" некоторое количество байтов памяти "add". Это также «назначило бы» эту память для хранения машинных инструкций для поиска в стеке вызовов двух «int» чисел, сложения их вместе и помещения результата в соответствующее место в стеке вызовов.
В системе типов, которая разделяет (и поддерживает) имена на блоки кода, конечным результатом является то, что вы можете легко передавать блоки кода по ссылке во многом так же, как вы можете изменять память по ссылке. Главное - убедиться, что система типов «соответствует» только совместимым типам, в противном случае передача вокруг блоков кода может вызвать ошибки (например, возвращение long, если изначально определено, чтобы возвращать int).
В Java все типы преобразуются в «сигнатуру», которая является строковым представлением имени метода и «типа». Глядя на предоставленный пример добавления, подпись
// This has a signature of "add(I,I)I"
int add(int first, int second) {
return first + second;
}
Если Java поддерживает (как это делает Clojure) присвоение имени метода, ему придется расширить свои объявленные правила системы типов и разрешить присвоение имени метода. Ложный пример назначения метода логически будет выглядеть как
subtract = add;
но для этого потребуется объявить вычитание со строго типизированным (для соответствия Java) «типом».
public subtract(I,I)I;
И без некоторой осторожности такие объявления могут легко наступить на уже определенные части языка.
Но вернемся к вашему ответу. В тех языках, которые его поддерживают, имена в основном являются указателями на блоки кода и могут быть переназначены при условии, что вы не нарушите ожидания параметров ввода и возврата.