Eclipse - `открытая иерархия вызовов` прекратить поиск в лямбда-цепочке

Вот мой пример кода Java:

public class Test {

    public static void main(String[] args) {
        methodDepth0(
            ()->
                methodDepth1(
                    ()->
                        methodDepth2()
                )
        );
    }

    static Object methodDepth2() {
        return null;
    }

    interface MyIF {
        void call();
    }

    static void methodDepth0(MyIF myIf){
        myIf.call();
    }

    interface MyIF2 {
        void call();
    }

    static void methodDepth1(MyIF2 myIf2){
        myIf2.call();
    }
}

Когда я открываю вызов иерархии метода methodDepth2() из Затмения (4.4), open call hierarchy прекратить поиск следующего абонента: открытая иерархия вызовов прекратить поиск следующего вызывающего метода

То, что я ожидаю, похоже на открытие иерархии вызовов метода methodDepth1() которые показывают, пока main метод. Открывающая иерархия вызовов метода <code> methodDepth1 () </ code>, которая отображается до метода <code> main </ code methodDepth1 () , которая отображается до метода main

2 ответа

Из того, что я могу сказать, отсутствие глубины иерархии вызовов связано с (пере) оценкой кода во время выполнения. Это объясняется в 15.27.4. Оценка лямбда-выражений во время выполнения в спецификации языка Java.

Во время выполнения оценка лямбда-выражения аналогична оценке выражения создания экземпляра класса, поскольку при нормальном завершении создается ссылка на объект. Оценка лямбда-выражения отличается от исполнения лямбда-тела.

Как ясно показывает вторая картинка, Eclipse может отслеживать иерархию вызовов через вызов метода myIf.call() внутри methodDepth0, Это правильно, потому что (внешняя) лямбда реализует метод MyIF.call(),

Тот факт, что тот же шаблон не работает на следующем уровне вложенности, выглядит как ошибка. Пожалуйста, рассмотрите возможность регистрации ошибки для JDT/UI. ТИА.

Просто отметьте, что для лямбда-выражений, реализующих библиотеки типа Consumer<T> количество звонивших в accept(T) в рабочей области может легко стать неуправляемым, подобно любой иерархии вызовов, например, через Runnable.run() - но это не ставит под сомнение общую полезность иерархии вызовов через лямбды.

Другие вопросы по тегам