提问人:blue_note 提问时间:9/18/2019 最后编辑:Guy Coderblue_note 更新时间:9/19/2019 访问量:272
静态类型是在编译时还是运行时强制执行?
Is static typing enforced at compile-time or run-time?
问:
主要是问我主要熟悉的 java/c++。
- 是否仅在编译时用于检查正确性的类型信息,然后被丢弃?(即 Java 在编译后是否像 Python 一样工作?
- 类型信息是否保留并再次用于运行时检查?
- 此行为是否因语言而异
答:
1赞
Benjamin Berman
9/18/2019
#1
在 Java 中,某些类型信息在运行时保留。这就是为什么你可以得到 s。不过,并非全部都是如此。特别是,Java 中的泛型是使用类型擦除实现的,这意味着在运行时,a 看起来像 a(尽管它看起来不像 )。java.lang.ClassCastException
ArrayList<String>
ArrayList<Integer>
HashSet<String>
在其他语言中,行为有所不同。例如,在 C 语言中,尽管有静态类型,但您可以在运行时执行各种操作(例如,将指向字符串的指针复制到包含指向整数数组的指针的变量中)而不会出错。
评论
1赞
Benjamin Berman
9/18/2019
@user4581301编辑
1赞
bobah
9/19/2019
#2
C++ 中的类型用于编译器,并且是编译时。模板不是泛型,它们实际上是编译器生成特定于静态类型的代码的指令。例如,您可以调用模板参数的静态方法,这在语法上是不可能的。
C++运行时类型信息可通过 typeid/typeinfo 和 dynamic_cast运算符(后者可能使用前者)获得。但即使这样也可以在编译过程中禁用以节省空间。
上一个:“继承”函数参数
下一个:将地图区域划分为给定半径的重叠圆
评论
typeid
example of enforcing or not enforcing types at runtime
参见:Hindley-Milner (HM) 型系统