2015-04-12 74 views
2

我有一個「理論」的問題,但這是爲了瞭解java編譯規則(或解釋器也許)背後的東西。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. 爲什麼違反規則會導致運行時錯誤?
+0

未定義的行爲,我想。所有類型的東西都不能正常工作(多態,虛擬方法調度等),這就是爲什麼一組規則被確定到你的代碼應該遵守的地方(JLS)。沒有人想知道由於「完全理論化」而忽略這些編譯錯誤所導致的確切問題。因此:未定義。 –

+0

@JeroenVannevel - 「未定義的行爲」不是我正在尋找的答案。我編輯了這個問題,使其更清晰 –

+0

它可能不是你要找的東西,但我懷疑你會得到任何其他東西。你問的行爲從字面上沒有定義,所以你只能猜測這個假設情況。也許錯誤的方法被執行?也許運行時開始拋出錯誤?誰知道。 –

回答

0
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和你認爲「幾乎是程序但語法錯誤很少」的東西沒有很大的區別。

0
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方法() Ÿ擴展X所以Y的從他的父類相同方法GetValue()。 那麼編譯器如何知道你想使用哪一個getValue()方法,如果它們都具有相同的名稱?

如果你明白第一個答案,你可以單獨回答第二個問題;)