Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态类型是在编译时还是运行时强制的?_Java_C++_Language Agnostic_Type Systems - Fatal编程技术网

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

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/c++

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

在Java中,一些类型信息在运行时保存。这就是为什么您可以获得
java.lang.ClassCastException
s。不过,并非所有的都是这样。特别是,Java中的泛型是使用类型擦除实现的,这意味着在运行时,
ArrayList
看起来像
ArrayList
(但它看起来不像
HashSet


在其他语言中,这种行为是不同的。在C++中,例如,在运行时,可以完成各种事情(例如,将一个指针复制到一个包含一个整数数组指针的变量),尽管静态类型是错误的,但没有错误,

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


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

第三点可以用“是”来回答,这使得第1点和第2点有点混乱。@user4581301:谢谢。我怀疑是这样,只是想举一些在运行时强制或不强制类型的例子。C++的目标是在编译时尽可能多地输出类型,所以除非您要求运行时类型,否则它就消失了,变量在内存中减少为偏移量。除非涉及多态性,否则在程序中请求
typeid
几乎肯定会在编译时用正确的类型信息替换。Java我已经不太了解了(假设我已经了解了,这是很危险的)可以评论。
在运行时强制或不强制类型的示例
请参见:感兴趣:@user4581301