该invokedynamic指令用于帮助VM在运行时确定方法引用,而不是在编译时对其进行硬连线.
这对于动态语言很有用,其中确切的方法和参数类型在运行时才知道.但Java lambda不是这种情况.它们被转换为具有明确定义的参数的静态方法.并且可以使用此方法调用此方法invokestatic.
那么invokedynamiclambda 的需求是什么,尤其是在性能受到影响的情况下?
根据JLS 15.27.2,lambda 主体与周围上下文具有相同的范围,我想知道是否有特定原因来说明为什么 lambda 实现的接口中的默认方法在主体中也不可用? 此限制是否启用了一些优化,还是只是为了保持重载规则简单?
我今天正在对一些 Java 8 API 进行原型设计,当我遇到这个限制时,我感到非常失望,因为使用默认方法可以让我以一种非常优雅和非侵入性的方式实现该 API。
通过要求静态导入或多或少可以实现相同的优雅,但这会导致“污染”命名空间。
有没有可能取消这个限制?