java eclipse lambda call-hierarchy

java - Eclipse-`abrir jerarquía de llamadas` dejar de buscar en la cadena Lambda



call-hierarchy (2)

Aquí está mi código Java de muestra:

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(); } }

Cuando abro la jerarquía de llamadas del método methodDepth2() desde Eclipse (4.4), open call hierarchy para buscar la siguiente persona que llama:

Lo que espero es como abrir la jerarquía de llamadas del método methodDepth1() que muestra hasta el método main .


Como muestra claramente la segunda imagen, Eclipse puede rastrear la jerarquía de llamadas a través del método call myIf.call() dentro de methodDepth0 . Esto es correcto porque la (externa) lambda implementa el método MyIF.call() .

El hecho de que el mismo patrón no funcione en el siguiente nivel de anidamiento parece un error. Por favor considere archivar un error para JDT / UI. TIA.

Solo tenga en cuenta que para lambda que implementa tipos de bibliotecas como Consumer<T> , el número de personas que llaman a accept(T) en un área de trabajo puede volverse inmanejable, similar a cualquier jerarquía de llamadas, por ejemplo, Runnable.run() , pero No cuestione la utilidad general de las jerarquías de llamadas a través de lambdas.


Por lo que puedo decir, la falta de profundidad de la jerarquía de llamadas se debe a (re) evaluación del código en tiempo de ejecución. Se explica en 15.27.4 Evaluación en tiempo de ejecución de Lambda Expressions en la especificación del lenguaje Java.

En el tiempo de ejecución, la evaluación de una expresión lambda es similar a la evaluación de una expresión de creación de instancia de clase, en la medida en que la terminación normal produce una referencia a un objeto. La evaluación de una expresión lambda es distinta de la ejecución del cuerpo lambda.