繁体   English   中英

静态类型是在编译时还是在运行时强制执行?

[英]Is static typing enforced at compile-time or run-time?

主要询问我最熟悉的Java / C ++。

  • 类型信息是否仅在编译时用于检查正确性然后丢弃? (即,编译后java是否像python一样工作?)
  • 类型信息是否保留并再次用于运行时检查?
  • 每种语言的行为是否有所不同

在Java中,某些类型信息在运行时保留。 这就是为什么您可以获取java.lang.ClassCastException的原因。 但是,并非全部。 特别是,Java中的泛型使用类型擦除来实现,这意味着在运行时, ArrayList<String>看起来像ArrayList<Integer> (尽管看起来不像HashSet<String> )。

在其他语言中,行为不同。 例如,在C语言中,尽管是静态类型,您也可以在运行时进行各种操作(例如,将指向字符串的指针复制到包含指向整数数组的指针的变量中),而不会出错。

C ++中的类型适用于编译器,是编译时。 模板不是通用的,它们实际上是编译器生成静态类型特定代码的指令。 例如,您可以调用模板参数的静态方法,这在Java中在语法上是不可能的。

C ++运行时类型信息可通过typeid / typeinfodynamic_cast运算符(后者可以使用前者)获得。 但是即使在编译过程中也可以禁用它,以节省空间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM