Java 什么时候进行类型检查

When does type checking happen in Java

我的作业中有一个问题看起来像这样。

以下哪个过程仅在 Java 的编译期间发生?

(i) 类型推断——推断未指定类型的变量的类型。
(ii) 类型擦除——用 Object 或其绑定替换泛型的类型参数。
(iii) 类型检查——检查值是否与分配给它的变量的类型相匹配。

一个。只有 (i)
B. 只有 (i) 和 (ii)
C. 只有 (i) 和 (iii)
D. 只有 (ii) 和 (iii)
E. (i)、(ii) 和 (iii)

根据我的理解,Java 仅在编译期间对泛型进行类型检查,因此 (i) 和 (ii) 绝对正确。但是,我不确定类型检查,从提供的描述来看,类型检查似乎并不局限于泛型,还包括其他方面。

这道题的答案是B,但是没有给出解释。我想知道,什么时候进行类型检查?如果它不仅发生在编译时,它是同时发生在编译时和运行时,还是只发生在运行时,为什么?

它也会在运行时发生,因为您可以将对象转换为其子类型。您可以使用 instanceof.

手动强制它在任何时候再次进行类型检查

You see Java is not a completely statically typed language. Whenever you cast an object from a type to a subtype, the JVM performs a dynamic (runtime) typecheck to check that the object really is an instance of the subtype. Using instanceof is another example of dynamic type checking.

来自这个answer