invokedynamic和implicit方法
据我所知,通过阅读这篇文章,了解JDK 7中的新的invokedynamic字节码指令,它可以调用对象的方法,这些方法不是在对象的类中静态定义的,并且可以将这些方法调用解析为某些具体的静态方法其他类通过拦截方法调用目标分辨率(帖子举例)。
这是否意味着Java 7类可以具有像Scala一样的隐式方法? 如果不是,Scala中的隐式方法解析与invokedynamic方法解析有什么不同?
这完全不相关。 scala中的含义在编译时完全解决 。 编译器插入你自己写的东西。 如果它不能这样做,在编译时就会出现错误。 InvokeDynamic是关于在运行时查找该方法,如果找不到,则在运行时会失败。
具体来说,如果你在scala xm()
中写入类型x中没有方法m的地方,它会查找一个隐式转换,即一个函数,例如f,它在范围内(此时可以调用f),它被标记为隐式的 ,它将接受x作为参数,其结果类型有一个方法m
(规则中有更多的细节,但这是本质的)。 如果它找到了这样一个方法,那么它会用适当类型的f(x).m()
来代替xm()
f(x).m()
。 它也可以在代码中以这种方式编写,并且它必须以java编写。 如果没有找到这样的函数f,那么会有编译时错误。
如果你调用g(x)
并且x
不是正确的类型被传递给g
它会以同样的方式发生。 如果有函数f
使得f(x)
具有适当的类型,那么它将用g(f(x))
代替代码。 再说一遍,你可以用普通的Scala编写自己的代码,并且如果没有这种方法,它就不会编译。
动态是关于在编译时不用担心太多,无论是在x
有一个m
方法还是在运行时寻找一个方法。 这就像JRuby或Groovy这样的动态语言通常是如何工作的。 有一些与斯卡拉相关的东西,动态特征(标记为实验)。
invokedynamic字节码将有助于加速JVM上的动态语言。 它还将加速访问Scala中的结构类型。 invokedynamic(以及JDK 7之前的唯一选项)的替代方法是反射,这非常慢。
Java-the-language是静态类型的,并且没有使用invokedynamic的特性(根据这个问题,除了使用java.lang.invoke.MethodHandle进行显式反射方法调用外)。
斯卡拉暗示实际上是静态解决的,因此与invokedynamic无关。 有关它如何工作的详细信息,请参阅Daniel Sobral的优秀揭示:Scala在何处查找隐含信息?
链接地址: http://www.djcxy.com/p/63459.html