2015-06-11 8 views
10

Wir aktualisieren ein Java 6-Projekt auf Java 8. Das erneute Kompilieren mit Java 8 gibt Fehler in einer java.awt.Frame-Unterklasse, die ich auf Folgendes vereinfacht habe:Java 8-Upgrade verursacht Compiler-Fehler mit geerbter Static Enum

org/example/Foo.java

package org.example; 

import org.example.Type; 
import java.awt.Frame; 

public class Foo extends Frame { 
    public Foo() { 
     System.out.println(Type.BAZ); // <=== error here, BAZ cannot be resolved 
    } 
} 

org/example/Type.java

package org.example; 

public class Type { 
    public static final int BAZ = 1; 
} 

Was ist java.awt.Window.Type eine statische enum der Fall zu sein scheint 7 in Java eingeführt nimmt Priorität, obwohl es einen Import für org.example.Type gibt. Ist das richtig?

Bedeutet dies, dass wir alle Referenzen auf unseren Typ mit org.example.Type vollständig qualifizieren müssen?

+1

Ich vermute, dass Sie Recht haben und Java 8 übernimmt Vererbung über Importe. IMHO sollten Sie ein voll qualifiziertes Paket verwenden, um klar zu sein, welche "Typ" Sie meinen. Oder Sie könnten einen Klassennamen verwenden, der nicht in Konflikt mit einer eingebauten Klasse steht. –

+0

Das Ändern von "Typ" in "MyType" hat funktioniert, daher nehme ich bei Ihren Fragen "Ja" an. – gustafbstrom

Antwort

5

Es scheint eine statische Enum java.awt.Window.Type, eingeführt in Java 7, hat Vorrang, obwohl es einen Import für org.example.Type gibt. Ist das richtig?

Ja. Die Type Klasse ist neu, aber das Verhalten ist nicht. Dies ist beabsichtigt und nicht neu in Java 8.

Bedeutet dies, dass wir alle Referenzen auf unseren Type mit org.example.Type vollständig qualifizieren müssen?

Ja, solange Sie eine Klasse erweitern, die ein Type Mitglied enthält.

Ich würde fragen, warum Sie Frame obwohl verlängern: die meisten Menschen verlängern Frame oder JFrame, sollten sie nicht sein. Favor composition über Vererbung und all das.

Ein anderer Ansatz könnte darin bestehen, einen statischen Import zu verwenden, um die Type-Member spezifisch zu importieren, in diesem Fall BAZ. so etwas wie diese:

package org.example; 

import static org.example.Type.BAZ; 
import java.awt.Frame; 
public class Foo extends Frame { 
    public Foo() { 
     System.out.println(BAZ); 
    } 
} 

Das ist ein Schmerz im Nacken sein wird, wenn Type obwohl eine Reihe von Mitgliedern. Dennoch könnte ein weiterer Ansatz Type eine Schnittstelle zu machen, und dann Foo diese Schnittstelle implementieren:

public interface Type { 
    public static final int BAZ = 1; 
} 
public class Foo extends Frame implements Type{ 
    public Foo() { 
     System.out.println(BAZ); 
    } 
} 

Sie könnten auch eine Type Instanz in Ihrer Foo Klasse erstellen oder umbenennen Type den Konflikt zu vermeiden, oder eine Brücke erstellen zwischen Foo und Type.

Dies sind alles leicht hackish Lösungen, um Frame einfach nicht zu erweitern.

+0

Danke für die Antwort, ich stimme voll und ganz mit JFrame über Frame und Komposition über Vererbung überein, aber das ist bieriger 10 Jahre alter Code ohne Unit-Tests, so vorsichtig und mit minimalen Änderungen. – Adam