您只需对测试代码进行少量更改即可回答该问题。
将类型层次结构更改为
class Bar {}class Foo extends Bar {}和程序
public class Test { public static void main(String[] args) { if (Arrays.asList(args).contains("--withFoo")) { use(new Foo()); } } static void use(Bar foo) { // don't need actual pre }}现在,
Foo即使没有输入
main方法(使用HotSpot),该程序也会因错误(如果不存在)而失败。原因是验证者需要定义
Foo来检查将其传递给期望的方法
Bar是否有效。
如果类型完全匹配或目标类型为
java.lang.Object,则HotSpot会采用捷径,而不是加载类型,其中分配始终有效。这就是为什么您的原始代码不在时不会提早抛出的原因
Foo。
最重要的是,抛出错误的确切时间点取决于实现,例如,可能取决于实际的验证程序实现。正如您已经提到的,所保证的全部是,尝试执行需要链接的动作将引发先前检测到的链接错误。但是,您的程序很可能从未尝试过。



