我从阅读JDK7中新的this动态字节码指令中了解到,它使得在对象类中不是静态定义的对象上调用方法成为可能,并通过截获方法调用目标解析( post提供了一个示例)将这些方法调用解析为其他类中的一些具体的静态方法。
这是否意味着Java 7类可以像Scala一样拥有隐式方法?如果不是,那么Scala中的隐式方法解析与invokedynamic方法解析有什么不同呢?
发布于 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中有一些相关的东西,特征动态(标记为实验性)。
发布于 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?
https://stackoverflow.com/questions/7134537
复制相似问题