2016-11-05 33 views
0

我遇到了編譯問題,但無法理解它爲何發生。實際上很多時間花在瞭解原因的地方(在「垃圾」項目中這遠非明顯),但在重現該錯誤之後,我大大簡化了所有代碼,以便特別爲您顯示一個小例子:爲什麼根據java導入和靜態導入序列順序得到不同的編譯結果?

包裝結構:

com.company 
| 
----Main.class 
| 
----maker 
    | 
    ----Maker.class 

Maker.class

package com.company.maker; 

public interface Maker { 
} 

Main.class

package com.company; 

import static com.company.Main.MakerImpl.Strategy.STRATEGY1; 
import static com.company.Main.MakerImpl.Strategy.STRATEGY2; 
import com.company.maker.Maker; 

public class Main { 

    public static void main(String[] args) { 
     System.out.println(STRATEGY1.name() + STRATEGY2.name()); 
    } 

    static class MakerImpl implements Maker { 
     enum Strategy { 
      STRATEGY1, STRATEGY2 
     } 
    } 
} 

我在主類得到的編譯錯誤:

錯誤:(15,39)的java:找不到符號 符號:類設備 位置:類com.company.Main

如果我更改導入序列從

import static com.company.Main.MakerImpl.Strategy.STRATEGY1; 
import static com.company.Main.MakerImpl.Strategy.STRATEGY2; 
->import com.company.maker.Maker; 

->import com.company.maker.Maker; 
import static com.company.Main.MakerImpl.Strategy.STRATEGY1; 
import static com.company.Main.MakerImpl.Strategy.STRATEGY2; 

然後它被編譯成功。

這是Java編譯器的正常行爲嗎?如果是這樣,我想清楚地理解它爲什麼會發生。

P.S.使用Java版本1.8.0_112和1.7.0_80(MacOS的)

回答

2

檢查這個測試:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6391197

看來,編譯器看到的第一靜態導入,然後跳轉到把你內心的關懷類,但失敗,因爲它沒有讀取最後一個非靜態導入。

因此,當您更改導入順序時,不會發生此問題,因爲當編譯器讀取靜態導入並跳轉到處理內部類時,因爲這些導入用於內部類,因此編譯器很開心它已經導入了非靜態製造商界面。

這意味着進口是熱切的評估。

我希望這會有所幫助。

+0

是的,這是我看到的一個老bug。謝謝。 –