gpt4 book ai didi

java - 调用动态和隐式方法

转载 作者:搜寻专家 更新时间:2023-11-01 01:04:19 25 4
gpt4 key购买 nike

据我阅读了解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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com