Java 静态类型是在编译时还是运行时强制的?
主要询问我主要熟悉的java/c++Java 静态类型是在编译时还是运行时强制的?,java,c++,language-agnostic,type-systems,Java,C++,Language Agnostic,Type Systems,主要询问我主要熟悉的java/c++ 类型信息是否仅在编译时用于检查正确性,然后被丢弃?(也就是说,java在编译后是否能像python一样工作?) 是否保留类型信息,并在运行时再次用于检查 这种行为在不同的语言中有所不同吗 在Java中,一些类型信息在运行时保存。这就是为什么您可以获得java.lang.ClassCastExceptions。不过,并非所有的都是这样。特别是,Java中的泛型是使用类型擦除实现的,这意味着在运行时,ArrayList看起来像ArrayList(但它看起来不像
- 类型信息是否仅在编译时用于检查正确性,然后被丢弃?(也就是说,java在编译后是否能像python一样工作?)
- 是否保留类型信息,并在运行时再次用于检查
- 这种行为在不同的语言中有所不同吗
java.lang.ClassCastException
s。不过,并非所有的都是这样。特别是,Java中的泛型是使用类型擦除实现的,这意味着在运行时,ArrayList
看起来像ArrayList
(但它看起来不像HashSet
)
在其他语言中,这种行为是不同的。在C++中,例如,在运行时,可以完成各种事情(例如,将一个指针复制到一个包含一个整数数组指针的变量),尽管静态类型是错误的,但没有错误, 类型是C++编译器的编译时间。模板不是泛型,它们实际上是编译器生成静态类型特定代码的指令。例如,您可以调用模板参数的静态方法,这在Java中在语法上是不可能的
C++运行时类型信息可通过和运算符获得(后者可使用前者)。但即使在编译过程中也可以禁用此选项以节省空间。第三点可以用“是”来回答,这使得第1点和第2点有点混乱。@user4581301:谢谢。我怀疑是这样,只是想举一些在运行时强制或不强制类型的例子。C++的目标是在编译时尽可能多地输出类型,所以除非您要求运行时类型,否则它就消失了,变量在内存中减少为偏移量。除非涉及多态性,否则在程序中请求
typeid
几乎肯定会在编译时用正确的类型信息替换。Java我已经不太了解了(假设我已经了解了,这是很危险的)可以评论。在运行时强制或不强制类型的示例
请参见:感兴趣:@user4581301