2015-06-11 3 views
10

Stiamo aggiornando un progetto Java 6 su Java 8. La ricompilazione con Java 8 genera errori in una sottoclasse java.awt.Frame, ho semplificato quanto segue:L'aggiornamento a Java 8 causa l'errore del compilatore con enum statico ereditato

org/es/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/es/Type.java

package org.example; 

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

Quello che sembra accadere è un enum statica java.awt.Window.Type introdotto in Java 7 è in corso la precedenza anche se esiste un'importazione per org.example.Type. È corretto?

Questo significa che dovremo qualificare completamente tutti i riferimenti al nostro tipo con org.example.Type?

+1

Ho il sospetto che tu abbia ragione e Java 8 sta ereditando le importazioni. IMHO dovresti usare un pacchetto completo per essere chiari su quale "Tipo" intendi. Oppure puoi usare un nome di classe che non sia in conflitto con una classe integrata. –

+0

Cambiare 'Tipo' in' MyType' ha funzionato, quindi presumo 'Sì' nelle tue domande. – gustafbstrom

risposta

5

Quello che sembra accadere è un java.awt.Window.Type enum statica introdotto in Java 7 è tale da prevalere, anche se v'è una di importazione per org.example.Type. È corretto?

Sì. La classe Type è nuova, ma il comportamento non lo è. Questo è di progettazione, e non nuovo per Java 8.

Ciò significa che dovremo qualificare tutti i riferimenti al nostro tipo con org.example.Type?

Sì, purché si stia estendendo una classe che contiene un membro Type.

Vorrei chiedere perché si sta estendendo Frame però: la maggior parte delle volte le persone si estendono Frame o JFrame, non dovrebbero essere. Favorisci la composizione sull'eredità, e tutto il resto.

Un altro approccio potrebbe essere l'utilizzo di un'importazione statica per importare in modo specifico i membri Type, in questo caso BAZ. qualcosa di simile:

package org.example; 

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

che sarà un dolore al collo se Type ha un sacco di membri però. Ancora un altro approccio potrebbe essere quello di rendere Type un'interfaccia, e quindi avere Foo implementare tale interfaccia:

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

Si potrebbe anche creare un'istanza Type nella classe Foo, o rinominare Type per evitare il conflitto, o di creare un ponte tra Foo e Type.

Queste sono tutte le soluzioni leggermente hackish semplicemente non si estende però frame.

+0

Grazie per la risposta, sono d'accordo con JFrame su Frame e composizione sull'ereditarietà, ma questo è un codice a 10 anni con zero test senza unità, quindi calpestando attentamente e apportando modifiche minime. – Adam

Problemi correlati