Ответ 1
Важное примечание: Вопрос касался более раннего предложения. Это не был выбран синтаксис. См. Этот Q/A как "историческую ссылку".
Этот синтаксис описан в BGGA-предложения от Гилада Брача, Нила Гафтера, Джеймса Гослинга и Питера фон дер Аэ.
Этот фрагмент кода можно описать следующим образом:
-
В качестве второго аргумента берется функция, принимающая параметры
(T, T)
и возвращающаяNumber
(и назначает ее параметруblock
) -
Затем он создает из него
Comparator<T>
. Это осуществляется с помощью методаcompare
, делегируя его вызовуblock
. -
Проводит этот компаратор к методу
Collections.sort
.
Здесь идет разбивка синтаксиса:
public static <T> void sort(List<T> l, final {T, T=>Number} block) {
^^^^^^^^^^^^^^^^^^^^
Аргумент под названием block
, который имеет функцию типа, которая принимает два T
и возвращает a Number
".
Collections.sort(l, new Comparator<T>() {
public int compare(T arg0, T arg1) {
...
}
}
}
Обычный вызов Collections.sort
с экземпляром анонимного подкласса Comparator
в качестве второго аргумента...
...
return block.invoke(arg0, arg1);
...
..., который возвращает число, вычисленное функцией, определяемой аргументом block
.
Полагаясь на классическую Java, ваш фрагмент будет соответствовать чему-то вроде
interface Block<T> {
public int invoke(T arg1, T arg2);
}
class Test {
public static <T> void sort(List<T> l, final Block<T> block) {
Collections.sort(l, new Comparator<T>() {
public int compare(T arg0, T arg1) {
return block.invoke(arg0, arg1);
}
});
}
}