Подтвердить что ты не робот

Введение в Java

Можно ли описать этот тип кода для понимания закрытия Java.

public static <T> void sort(List<T> l, final {T, T=>Number} block) {

    Collections.sort(l, new Comparator<T>() {
        public int compare(T arg0, T arg1) {
            return block.invoke(arg0, arg1);
        }
    }
}
4b9b3361

Ответ 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);
            }
        });
    }
}

Ответ 2

Как указывает @axtavt, Java 7 (к сожалению) не собирается закрывать. Тем не менее, Groovy делает, работает на JVM и очень хорошо интегрируется с другим кодом Java. Я читал это для получения дополнительной информации.