静态类型是在编译时还是运行时强制实施的?

Is static typing enforced at compile-time or run-time?

本文关键字:运行时 类型 静态类 编译 静态      更新时间:2023-10-16

主要是问我主要熟悉的java/c ++。

  • 类型信息是否仅在编译时用于检查正确性,然后被丢弃?(即Java在编译后是否像Python一样工作?
  • 类型信息是否保留并在运行时再次用于检查?
  • 此行为是否因语言而异

在 Java 中,某些类型信息保存在运行时。 这就是为什么你可以得到java.lang.ClassCastExceptions。 不过,并非全部都是。 特别是,Java中的泛型是使用类型擦除实现的,这意味着在运行时,ArrayList<String>看起来像一个ArrayList<Integer>(虽然它看起来不像HashSet<String>(。

在其他语言中,行为有所不同。 例如,在 C 中,尽管有静态类型,你可以在运行时做各种各样的事情(例如,将指向字符串的指针复制到包含指向整数数组的指针的变量中(。

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

运行时类型信息C++可通过 typeid/typeinfo 和 dynamic_cast 运算符(后者可以使用前者(获得。但即使在编译过程中也可以禁用此功能以节省空间。