2016-11-05 4 views
0

Ich habe ein Problem mit der Kompilierung, aber kann nicht verstehen, warum es auftritt. Eigentlich wurde viel Zeit damit verbracht zu verstehen, wo der Grund ist (es war bei einem "Mist" -Projekt alles andere als offensichtlich), aber nachdem ich diesen Fehler reproduziert habe, vereinfacht ich den ganzen Code, um ein kleines Beispiel speziell für dich zu zeigen:Warum erhalte ich je nach Java-Import und Reihenfolge der statischen Imports unterschiedliche Kompilierergebnisse?

Paketstruktur:

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 
     } 
    } 
} 

Und ich habe Kompilierungsfehler in Hauptklasse:

Fehler: (15, 39) java: Klasse Maker Lage: nicht Symbol Symbol finden Klasse com.company.Main

Und wenn ich die Importsequenz ändern von

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

bis

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

dann ist es erfolgreich kompiliert.

Ist es normales Verhalten des Java Compilers? Wenn das so ist, möchte ich klar verstehen, warum es passiert.

P.S. mit getestet Java-Version 1.8.0_112 und 1.7.0_80 (MacOS)

Antwort

2

Check this:

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

Es scheint, dass der Compiler den ersten statischen Import sieht und springt dann die Pflege Ihres inneren zu nehmen Klasse, aber schlägt fehl, weil es den letzten nicht statischen Import nicht gelesen hat.

Wenn Sie die Importreihenfolge ändern, tritt dieses Problem nicht auf, da, wenn der Compiler den statischen Import liest und springt, um die innere Klasse zu kümmern, da diese Importe in der inneren Klasse verwendet werden, ist der Compiler glücklich Es hat bereits die nicht statische Maker-Schnittstelle importiert.

Wich bedeutet, dass die Importe eifrig ausgewertet werden.

Ich hoffe, das hilft.

+0

Ja, das ist ein alter Fehler, wie ich sehe. Vielen Dank. –

Verwandte Themen