2011-10-13 9 views
20

Prawdopodobnie nie można wykonać następujących czynności (otrzymuję błąd kompilacji: "Metoda odziedziczona A.doSomthing (int) nie może ukryć publicznej metody abstrakcji w B"):Java: rozszerzenie klasy i implementacja interfejsu, który ma tę samą metodę.

public class A { 
    int doSomthing(int x) { 
     return x; 
    } 
} 

public interface B { 
    int doSomthing(int x); 
} 

public class C extends A implements B { 

    //trying to override doSomthing... 

    int doSomthing(int x) { 
     return doSomthingElse(x); 
    } 
} 

Zakładając ja wolno zmieniać ani a, ani B, moje pytanie jest może jakoś zdefiniować C w taki sposób, że będzie dziedziczyć zarówno a i B (załóżmy, że jest to wymagane w przypadku niektórych ram że C będzie zarówno instancją A, jak i B).

A jeśli nie, w jaki sposób obejmiesz to?

Dzięki!

+0

Proszę zgłosić swój błąd. Nie ma tu oczywiście nic złego, z wyjątkiem być może brakującego @Overrides, jeśli używasz 1.6. – bmargulies

+2

@bmargulies, nie ma "public", a zastąpienie jest opcjonalną przykrością. – bestsss

Odpowiedz

24

sprawiają, że metoda publicznego

public class C extends A implements B { 

    //trying to override doSomthing... 

    public int myMethod(int x) { 
     return doSomthingElse(x); 
    } 
} 

metody interfejsu są zawsze public

lub po prostu użyć skład zamiast dziedziczenie

+0

Dziękuję i wszystkie inne osoby odpowiadające. To rozwiązało problem! – rapt

+0

Czy zmienna może być zarówno instancją klasy, jak i dziedziczyć interfejs? W twoim przykładzie byłoby to coś w stylu 'new C() implementuje X' przy założeniu, że X jest interfejsem – Vadorequest

+1

@ Implementacja lub rozszerzenie pakietu jest na poziomie klasy, a nie na poziomie instancji. Aby zaimplementować X, musisz dodać go do listy interfejsów: 'public class C extends A implements B, X {...}' –

2

ten ma do czynienia z widocznością. Używasz widoczności default (bez modyfikatora) w C dla myMethod, ale musi to być public zgodnie z interfejsem B.

Teraz myślisz użyłeś widoczność default dla wszystkich z nich, ponieważ w żadnym A, B, ani C pan jednoznacznie wybrać jeden z public, private lub protected. Jednak interfejs używa public niezależnie od tego, czy wyraźnie to określono.

+0

Dziękujemy! Właściwie to wiedziałem, ale przypomniałeś mi. – rapt

0

Po prostu wykonanie metody public, gdy nadpisze ją w C zrobi.

7

Sposób doSomethis() jest pakiet-prywatnego w klasie A:

public class A { 
    int doSomthing(int x) { // this is package-private 
     return x; 
    } 
} 

Ale to publicznego w interfejsie B:

public interface B { 
    int doSomthing(int x); // this here is public by default 
} 

Compiler bierze doSomething() odziedziczony przez C z A, który jest pakiet-prywatny jako implementacja tego w B, który jest publiczny. Dlatego to skarży -

"The inherited method A.doSomthing(int) cannot hide the public abstract method in B"

Ponieważ podczas nadrzędnym się sposób nie można zawęzić poziom dostępu metody.

Rozwiązanie jest proste, w klasie C -

@Override 
public int doSomthing(int x) { 
    // ... 
} 
Powiązane problemy