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

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

提问人:blue_note 提问时间:9/18/2019 最后编辑:Guy Coderblue_note 更新时间:9/19/2019 访问量:272

问:

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

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

评论

6赞 user4581301 9/18/2019
第三点可以用“是”来回答,这使得第 1 点和第 2 点有点混乱。
0赞 blue_note 9/18/2019
@user4581301:谢谢。我怀疑是这样,只是想要一些在运行时强制执行或不强制执行类型的示例
1赞 user4581301 9/18/2019
C++的目标是在编译时尽可能多地输出,所以除非你要求运行时类型,否则它就消失了,变量减少到减少到内存中的偏移量。除非涉及多态性,否则几乎可以肯定的是,在编译时,程序中的请求会被替换为正确的类型信息。Java 我现在已经不够了解了(假设我曾经这样做是有风险的)来评论。typeid
1赞 Guy Coder 9/19/2019
example of enforcing or not enforcing types at runtime参见:Hindley-Milner (HM) 型系统
1赞 Guy Coder 9/27/2019
兴趣:软件基础

答:

1赞 Benjamin Berman 9/18/2019 #1

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

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

评论

1赞 Benjamin Berman 9/18/2019
@user4581301编辑
1赞 bobah 9/19/2019 #2

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

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