java - 调用动态和隐式方法

标签 java scala java-7 invokedynamic implicit-methods

据我阅读了解this发布关于 JDK 7 中新的 invokedynamic 字节码指令,它可以调用对象类中未静态定义的对象的方法,并通过拦截方法将这些方法调用解析为其他类中的一些具体静态方法调用目标解析(帖子给出了示例)。

这是否意味着 Java 7 类可以像 Scala 一样拥有隐式方法?如果不是,Scala 中的隐式方法解析与 invokedynamic 方法解析有何不同?

最佳答案

完全没有关系。 scala 中的隐式在编译时完全解析。编译器会插入一些您也可以自己编写的内容。如果它不能做到这一点,那么在编译时就会出错。 InvokeDynamic 是关于在运行时找到方法,如果找不到则在运行时失败。

具体来说,如果你用 scala 编写 x.m()在类型 x 中没有方法 m 的地方,它将寻找一个隐式转换,即一个函数,比如 f,它在范围内(此时你可以调用 f),它被标记为 implicit,它将接受 x 作为参数,其结果类型有一个方法 m (规则中有很多细节,但这是本质)。如果它找到这样的方法,那么它将替换 x.m()通过正确输入 f(x).m() .它也可以在代码中以这种方式编写,并且必须在 java 中编写。如果找不到这样的函数 f,则存在编译时错误。

如果您调用 g(x),它会以同样的方式发生和 x不是传递给 g 的正确类型.如果有函数f这样 f(x)具有正确的类型,然后它将用 g(f(x)) 替换代码.同样,你可以自己用普通的 scala 编写,如果没有这样的方法,它就不会编译。

动态是关于在编译时不要太担心是否有 m x 中的方法,并在运行时寻找一个。这就是像 JRuby 或 Groovy 这样的动态语言通常的工作方式。在scala中有一些相关的东西,特征动态(标记为实验性)。

关于java - 调用动态和隐式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7134537/

相关文章:

java - 变量改变我的单例对象内的状态

java - 执行 JDBC 事务时出现重复键异常

scala - 防止 PlayFramework 的模板引擎转义我的字符串

scala - 这是一个scala错误还是我做错了什么

scala - Spark 数据框选择在该行的任何列中至少有一个 null 或空白的行

java - 为什么Java编译器在下面的代码中为LinkedList DescendingIterator给出 "error: cannot find symbol"?

java - com.jayway.jsonpath.InvalidPathException : Invalid path $myVar. ID

java - 错误: Could not find or load main class SOAPTester

java - JDK7 现在可以安全使用吗?

WebLogic Server 上的 Java Web 应用程序内存使用情况