【问题标题】:java interpreter and compiler rule violationjava解释器和编译器规则违规
【发布时间】: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
}

注意:我知道什么是语法错误以及如何修复它们。

我的问题是:

  1. 如果我们“忽略”(理论上)编译器错误,运行时会发生什么情况?这个语法错误是为了避免什么?
  2. 为什么违反规则会导致运行时错误?

【问题讨论】:

  • 未定义的行为,我想。各种事情都不再正常工作(多态性、虚拟方法分派等),这就是为什么要确定一组规则(JLS)你的代码应该遵守的原因。没有人会费心去找出“忽略”这些编译错误所导致的确切问题,因为这完全是理论上的。因此:未定义。
  • @JeroenVannevel - “未定义的行为”不是我想要的答案。我编辑了问题以使其更清楚
  • 它可能不是您想要的,但我怀疑您会得到其他任何东西。您所询问的行为实际上没有定义,因此您只能猜测这种假设情况。也许执行了错误的方法?也许运行时开始抛出错误?谁知道呢。
  • @JeroenVannevel - 我相信它与内存、解释、java 语法/方法评估、操作系统寄存器等有关。对此有适当的解释。我只是找不到它(还)
  • @ZivLevy 我有几个问题要问你。你知道动态方法调度是什么吗?你知道什么是返回类型协方差吗?您认为这些功能是否可以在不设置您幻想删除的编译限制的情况下实现?如果我对您的最后一个问题的答案是否定的,那么您就有了答案。

标签: java compilation compiler-errors syntax-error


【解决方案1】:
class Y extends X {

        @Override //class Y extends class X which has a public method B getValue()
        public B getValue() {
            return super.getValue();  
        }

        private A getValue() {return null}

X 有一个名为 getValue() 的方法 Y 扩展了 X,因此 Y 具有来自他的超类的相同方法 getValue()。 那么,如果它们都具有相同的名称,编译器将如何知道要使用哪一个 getValue() 方法呢?

如果您理解第一个问题的答案,您可以单独回答第二个问题;)

【讨论】:

    【解决方案2】:
    What could have happen in runtime if we would "ignore" (in theory) the compiler errors?
    

    编译器将 Java 代码转换为字节码,字节码只是一组指令。要做到这一点,它确实需要非常具体的规则来知道要做什么——比如关键词、括号——语法。

    如果语法错误,它不知道如何处理它,因此无法转换它。

    对于编译器,尝试制作像这样的随机字符序列的程序:oawpgapwo nap gunapoigu awpougn awpougn apowrgn pagn pawog poawng panbx 和您认为“几乎是程序,但语法错误很少”的程序并没有太大区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多