【发布时间】:2015-06-17 20:58:28
【问题描述】:
我有一个“理论”问题,但这是为了了解 java 编译规则(或解释器)背后的一些东西。
假设我们有以下代码:
class A {}
class B extends A {}
class X {
public B getValue(){return null;}
}
class Y extends X {
public A getValue(){return null;} //compilation error here
}
class Z {
public List<A> getAList(List<B> x) {return x;} //compilation error here
}
注意:我知道什么是语法错误以及如何修复它们。
我的问题是:
- 如果我们“忽略”(理论上)编译器错误,运行时会发生什么情况?这个语法错误是为了避免什么?
- 为什么违反规则会导致运行时错误?
【问题讨论】:
-
未定义的行为,我想。各种事情都不再正常工作(多态性、虚拟方法分派等),这就是为什么要确定一组规则(JLS)你的代码应该遵守的原因。没有人会费心去找出“忽略”这些编译错误所导致的确切问题,因为这完全是理论上的。因此:未定义。
-
@JeroenVannevel - “未定义的行为”不是我想要的答案。我编辑了问题以使其更清楚
-
它可能不是您想要的,但我怀疑您会得到其他任何东西。您所询问的行为实际上没有定义,因此您只能猜测这种假设情况。也许执行了错误的方法?也许运行时开始抛出错误?谁知道呢。
-
@JeroenVannevel - 我相信它与内存、解释、java 语法/方法评估、操作系统寄存器等有关。对此有适当的解释。我只是找不到它(还)
-
@ZivLevy 我有几个问题要问你。你知道动态方法调度是什么吗?你知道什么是返回类型协方差吗?您认为这些功能是否可以在不设置您幻想删除的编译限制的情况下实现?如果我对您的最后一个问题的答案是否定的,那么您就有了答案。
标签: java compilation compiler-errors syntax-error