前段时间,Oracle决定在Java 8中添加Closures是个好主意.我想知道与Scala相比,那里的设计问题是如何解决的,Scala从第一天就开始关闭.
援引未解决的问题,从javac.info:
方法句柄可以用于函数类型吗? 如何做到这一点并不明显.一个问题是Method Handles重新定义类型参数,但是以一种干扰函数子类型的方式.
我们可以摆脱"throws"类型参数的显式声明吗? 只要声明的边界是一个经过检查的异常类型,这个想法就是使用析取类型推断.这不是严格向后兼容的,但它不太可能破坏真正的现有代码.然而,由于语法模糊,我们可能无法摆脱类型参数中的"抛出".
在旧式循环索引变量上禁止@Shared
处理像Comparator这样定义多个方法的接口,除了其中一个接口之外的所有接口都将由继承自Object的方法实现."使用单一方法的接口"的定义应仅计算不会由Object中的方法实现的方法,并且如果实现其中一个方法将全部实现它们,则应将多个方法计为一个方法.主要是,这需要更精确地说明接口只有一个抽象方法的含义.
指定从函数类型到接口的映射:名称,参数等.我们应该完全指定从函数类型到系统生成的接口的映射.
类型推断.需要增加类型推断的规则以适应异常类型参数的推断.同样,闭包转换使用的子类型关系也应该反映出来.
Elined异常类型参数有助于改进异常透明度. 也许使得省略的异常类型参数意味着绑定.这样可以通过添加新的通用异常参数来改进没有异常类型参数的现有通用接口,例如java.util.concurrent.Callable.
函数类型的类文字是如何形成的? 是#void().class?如果是这样,如果擦除对象类型,它是如何工作的?它是#?(?).class?
系统类加载器应动态生成函数类型接口. 与函数类型对应的接口应该由引导类加载器按需生成,因此它们可以在所有用户代码之间共享.对于原型,我们可能有javac生成这些接口,因此原型生成的代码可以在库存(JDK5-6)VM上运行.
每次对lambda表达式的求值必须产生一个新的对象吗? 希望不是.例如,如果lambda没有从封闭范围捕获变量,则可以静态分配.类似地,在其他情况下,如果lambda不捕获循环内声明的任何变量,则lambda可以移出内部循环.因此,如果规范不承诺关于lambda表达式的结果的引用标识,那么最好是这样的,因此这样的优化可以由编译器完成.
据我所知2.,6.和7.在Scala中不是问题,因为Scala不使用Checked Exceptions作为某种类似Java的"影子类型系统".
剩下的呢?