首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用动态和隐式方法

调用动态和隐式方法
EN

Stack Overflow用户
提问于 2011-08-21 04:36:25
回答 2查看 1.5K关注 0票数 4

我从阅读JDK7中新的this动态字节码指令中了解到,它使得在对象类中不是静态定义的对象上调用方法成为可能,并通过截获方法调用目标解析( post提供了一个示例)将这些方法调用解析为其他类中的一些具体的静态方法。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-21 05:04:35

这是完全无关的。scala中的隐含是在编译时完全解决的。编译器插入一些你也可以自己编写的东西。如果它不能做到这一点,那么在编译时就会出现错误。InvokeDynamic是关于在运行时找到方法,如果找不到就会在运行时失败。

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

如果调用g(x),而x的类型不适合传递给g,也会发生同样的情况。如果有一个函数f使得f(x)具有正确的类型,那么它将用g(f(x))替换代码。同样,您也可以用普通的scala自己编写,如果没有这样的方法,它将无法编译。

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

票数 13
EN

Stack Overflow用户

发布于 2011-08-21 05:03:54

invokedynamic字节码将有助于加速JVM上的动态语言。它还将加快对Scala中结构类型的访问。invokedynamic (也是JDK7之前的唯一选项)的替代方案是反射,它非常慢。

Java-the-language是静态类型的,并且没有使用invokedynamic的特性(根据this question的说法,除了使用java.lang.invoke.MethodHandle的显式反射方法调用)。

Scala隐含实际上是静态解析的,因此与invokedynamic无关。有关它的工作原理的详细信息,请参阅Daniel Sobral的优秀的expose:Where does Scala look for implicits?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7134537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档