2015-06-11 18 views
10

Uaktualniamy projekt Java 6 do Javy 8. Ponowna kompilacja z językiem Java 8 powoduje błędy w podklasie java.awt.Frame. Uprościliśmy następujące elementy:Uaktualnienie Java 8 powoduje błąd kompilatora z odziedziczonym statycznym wyliczaniem

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

Co wydaje się dzieje jest statyczną enum java.awt.Window.Type wprowadzone w Java 7 jest podejmowanie pierwszeństwo, nawet jeśli istnieje import dla org.example.Type. Czy to jest poprawne?

Czy to oznacza, że ​​będziemy musieli w pełni zakwalifikować wszystkie odniesienia do naszego typu przy użyciu org.example.Type?

+1

Podejrzewam, że masz rację, a Java 8 dziedziczy import. IMHO powinieneś użyć w pełni kwalifikowanego pakietu, aby jasno określić, który typ masz na myśli. Możesz też użyć nazwy klasy, która nie jest w konflikcie z klasą wbudowaną. –

+0

Zmieniło się "Typ" na "MyType", więc zakładam "Tak" na twoje pytania. – gustafbstrom

Odpowiedz

5

Co wydaje się dzieje jest statyczną enum java.awt.Window.Type wprowadzony w Javie 7 bierze pierwszeństwo mimo że jest import do org.example.Type. Czy to jest poprawne?

Tak. Klasa Type jest nowa, ale zachowanie nie jest. Jest to zgodne z projektem, a nie nowe w języku Java 8.

Czy to oznacza, że ​​będziemy musieli w pełni zakwalifikować wszystkie odniesienia do naszego typu przy użyciu org.example.Type?

Tak, pod warunkiem, że rozszerzasz klasę zawierającą element Type.

Chciałbym zapytać, dlaczego rozszerzasz numer Frame: najczęściej ludzie przedłużyć Frame lub JFrame, nie powinny. Składać kompozycję na dziedziczenie i tak dalej.

Innym podejściem może być użycie statycznego importu do specyficznego importowania elementów Type, w tym przypadku BAZ. coś takiego:

package org.example; 

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

To będzie ból w szyi, jeśli Type ma grono członków choć. Jeszcze inne podejście może być aby Type interfejs, a następnie mieć Foo wdrożenia tego interfejsu:

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

Można również utworzyć instancję Type w swojej klasie Foo lub zmiany nazwy Type aby uniknąć konfliktu, lub utworzyć most między Foo a Type.

Są to lekko hackowate rozwiązania, które po prostu nie rozszerzają ramki.

+0

Dziękuję za odpowiedź, zgadzam się z JFrame ponad Ramką i kompozycją w kwestii dziedziczenia, ale jest to 10-letni kod bez testów jednostkowych, więc ostrożnie kroczę i wprowadzam minimalne zmiany. – Adam

Powiązane problemy