Java 我们如何在JVM上拥有一种动态类型的语言?

Java 我们如何在JVM上拥有一种动态类型的语言?,java,dynamic,static,jvm,jruby,Java,Dynamic,Static,Jvm,Jruby,我们有Jython,JRuby,Groovy,它们是动态键入的,并在JVM上运行。我知道这些语言编译成字节码 其他语言,如Scala,支持类型推断,很明显编译器会为我们推断类型 但是Java是一种静态语言,它编译成字节码,这是否意味着字节码支持动态类型 例如,在Java中,我们需要在编译时声明变量类型,并且永远不能更改它。但是对于Python我们不必声明类型,但是我们可以在运行时为同一变量分配任何类型的值 动态类型是如何在静态语言上工作的?您混淆了语言和体系结构。一般来说,架构对类型一无所知。动

我们有
Jython
JRuby
Groovy
,它们是动态键入的,并在
JVM
上运行。我知道这些语言编译成字节码

其他语言,如Scala,支持类型推断,很明显编译器会为我们推断类型

但是
Java
是一种静态语言,它编译成字节码,这是否意味着字节码支持动态类型

例如,在
Java
中,我们需要在编译时声明变量类型,并且永远不能更改它。但是对于
Python
我们不必声明类型,但是我们可以在运行时为同一变量分配任何类型的值


动态类型是如何在静态语言上工作的?

您混淆了语言和体系结构。一般来说,架构对类型一无所知。动态类型是指对象携带类型信息。您可以将动态类型化语言想象为Java,它只包含类型“Object”和大量的“instanceof”检查


但是Java是一种静态语言,它编译成字节码,这是否意味着字节码支持动态类型

是的,就是这个意思

您可以看到Java不是一种完全静态类型化的语言。无论何时将对象从类型强制转换为子类型,JVM都会执行动态(运行时)类型检查,以检查该对象是否确实是该子类型的实例。使用
instanceof
是动态类型检查的另一个示例

当您使用反射API时,甚至当您使用泛型时,动态类型检查也在幕后使用

动态类型如何在静态语言上工作

如果它是一种纯粹的静态类型检查语言,那么它就不是。例如,Pascal是一种具有(纯)静态类型的强类型语言。但大多数现代编程语言至少支持某种级别的运行时类型检查。许多动态类型语言要么有可选的静态类型,要么有使用类型推断来提取类型相关错误的开发人员工具


顺便说一句,语言既可以是静态类型,也可以使用类型推断。类型推断应该被视为显式类型声明的替代品,而不是静态类型的替代品。

正如其他人所指出的,动态语言只是意味着一些(通常是全部)类型检查完全在运行时完成。您甚至可以在非常静态类型化(甚至几乎非类型化(x86机器代码))的环境中构建非常动态的语言


Java还为动态语言添加了越来越多的本机支持。Sun发布。

Java是一种静态语言,其类型系统是静态的。我不明白您是如何得出Java是静态的结论的,因此字节码支持动态的。字节码只是在虚拟机上本机运行的东西。PS:Python使用duck类型。如果你对它的工作原理感兴趣,可以查阅一下。关于你的最后一段:JVM与Java语言不同。C是一种纯静态类型检查语言,但大多数这些语言包括Java,都是基于C构建的。就可以做什么而言,底层语言的特性并不重要,它们只影响可能最有效的内容。它涉及大量链接的
if
语句。