调用动态和隐式方法

2024-04-04

据我从阅读中了解到this http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html关于 JDK 7 中新的 invokedynamic 字节码指令的帖子,它可以调用对象类中未静态定义的对象上的方法,并通过拦截该方法将这些方法调用解析为其他类中的某些具体静态方法调用目标解析(帖子给出了一个例子)。

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


这是完全不相关的。隐式在 scala 中是在编译时完全解决。编译器会插入一些您也可以自己编写的内容。如果不能做到这一点,在编译时就会出现错误。 InvokeDynamic 是在运行时查找方法,如果找不到则在运行时失败。

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

如果你打电话,也会发生同样的情况g(x) and x不是要传递给的正确类型g。如果有一个函数f这样f(x)有正确的类型,那么它将替换代码g(f(x))。同样,您可以自己用普通的 scala 编写它,并且同样,如果没有这样的方法,它将无法编译。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用动态和隐式方法 的相关文章

随机推荐