我们Jython
, JRuby
, Groovy
它是动态类型和运行在JVM
。 据我所知,这些语言编译成字节码。
如其他语言Scala
支持类型推断,其明确指出,编译器推断类型我们。
但是Java
是一种静态语言,它编译成字节码,这是不是意味着字节码支持动态类型?
比如,对于Java
,我们需要声明变量的类型在编译时,永远不能改变它。 但在情况下, Python
我们没有声明一个类型,但我们可以在运行时任何类型的值赋给同一个变量。
如何动态类型的工作有静态语言?
但Java是一种静态语言,它编译成字节码,这是不是意味着字节码支持动态类型?
是的,它确实意味着。
你看Java不是一个完全静态类型语言。 当你从一个类型的对象转换亚型时,JVM执行动态(运行时)类型检测,以检查对象真的是子类型的实例。 使用instanceof
是动态类型检查的另一个例子。
动态类型检查也被盖下使用时,使用反射API的,甚至当你使用泛型。
如何动态类型的工作有静态语言?
这是一个纯粹的静态类型检查的语言则没有。 例如,帕斯卡尔是(纯)静态类型强类型语言。 但大多数现代编程语言至少支持运行时类型检查的一些水平。 而很多动态类型语言具有使用类型推断回暖类型相关的错误或者是可选的静态类型,或开发工具。
顺便说一句,语言既可以是静态类型,并使用类型推断。 类型推断应被视为一种替代明确的类型声明,而不是作为替代静态类型。
正如其他人所指出的,动态语言只是意味着一些(通常全部)类型检查完全是在运行时完成。 你甚至可以在非常静态类型(甚至几乎无类型(x86机器代码))环境建设非常动态语言。
Java已经也已经增加了对动态语言越来越多的原生支持。 孙出版的这是什么意思一个很好的概述以及它如何帮助动态语言表现良好,并有宾至如归的感觉在JVM上 。
你混淆的语言和架构。 在一般的架构一无所知类型。 动态类型是当物体随身携带的类型信息。 你可以把动态类型语言如Java,只有类型“对象”,有很多“的instanceof”你背后的检查。