Hace algún tiempo, Oracle decidió que agregar Cierres a Java 8 sería una buena idea. Me pregunto cómo se resuelven los problemas de diseño en comparación con Scala, que tenía cierres desde el primer día.Cierres en Scala vs Cierres en Java
Citando el Cuestiones pendientes de javac.info:
Se puede Mangos Método usarse para los tipos de función? No es obvio cómo hacer que funcione. Un problema es que el método maneja los parámetros de tipo reify, pero de una manera que interfiere con la función de subtipado.
¿Podemos deshacernos de la declaración explícita de los parámetros del tipo "throws"? La idea sería usar inferencia de tipo disyuntiva siempre que el límite declarado sea un tipo de excepción comprobada. Esto no es estrictamente compatible con versiones anteriores, pero es poco probable que rompa el código real existente. Sin embargo, probablemente no podamos deshacernos de los "tiros" en el argumento tipo debido a la ambigüedad sintáctica.
Disallow @Shared en viejo estilo variables de índice bucle
interfaces de Handle como Comparador que definen más de un método, todos pero uno de los cuales se llevará a cabo por un método heredado de Object. La definición de "interfaz con un único método" debe contar solo con métodos que no se implementarían mediante un método en Object y debe contar varios métodos como uno si la implementación de uno de ellos los implementara a todos. Principalmente, esto requiere una especificación más precisa de lo que significa para una interfaz tener solo un único método abstracto.
Especificar correspondencia de los tipos de función para interfaces: nombres, parámetros, etc. Debemos especificar plenamente la correspondencia de los tipos de función a las interfaces generadas por el sistema con precisión.
Tipo de inferencia. Las reglas para la inferencia de tipos deben aumentarse para dar cabida a la inferencia de los parámetros del tipo de excepción. Del mismo modo, las relaciones de subtipo utilizadas por la conversión de cierre también deberían reflejarse.
Parámetros del tipo de excepción elida para ayudar a la modificación de la transparencia de excepción. Quizás hacer que los parámetros del tipo de excepción sean el límite. Esto permite la actualización de interfaces genéricas existentes que no tienen un parámetro de tipo para la excepción, como java.util.concurrent.Callable, mediante la adición de un nuevo parámetro de excepción genérico.
¿Cómo se forman los literales de clase para los tipos de funciones formados? ¿Es #void(). Clase? Si es así, ¿cómo funciona si los tipos de objetos se borran? ¿Es #? (?). Clase?
El cargador de clases del sistema debe generar dinámicamente interfaces de tipo de función. Las interfaces correspondientes a los tipos de funciones se deben generar a petición del cargador de clases de arranque, para que puedan compartirse entre todos los códigos de usuario.Para el prototipo, podemos hacer que javac genere estas interfaces para que el código generado por el prototipo pueda ejecutarse en máquinas virtuales (JDK5-6).
¿Debe la evaluación de una expresión lambda producir un objeto nuevo cada vez? Esperemos que no. Si una lambda no captura ninguna variable de un ámbito adjunto, por ejemplo, puede asignarse estáticamente. De manera similar, en otras situaciones una lambda podría moverse de un bucle interno si no captura ninguna de las variables declaradas dentro del bucle. Por lo tanto, sería mejor si la especificación no promete nada acerca de la identidad de referencia del resultado de una expresión lambda, por lo que el compilador puede realizar dichas optimizaciones.
Por lo que yo entiendo 2., 6. y 7. no son un problema en Scala, Scala, porque no utiliza excepciones comprobadas como una especie de "Shadow tipo de sistema" como Java.
¿Y el resto?