2011-10-13 17 views
20

Probabilmente non è possibile eseguire quanto segue (viene visualizzato un errore di compilazione: "Il metodo ereditato A.doSomthing (int) non può nascondere il metodo astratto pubblico in B"):Java: estensione di una classe e implementazione di un'interfaccia con lo stesso metodo

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

Supponendo mi è permesso di cambiare né a né B, la mia domanda è posso in qualche modo definire C in modo tale che possa ereditare da a e B (si supponga che è necessario per un quadro di riferimento che C sia un'istanza di A e B).

O se no, come faresti a risolvere questo?

Grazie!

+0

prega di segnalare l'errore. Non c'è nulla di evidentemente sbagliato qui, tranne forse un @Overrides mancante se si utilizza 1.6. – bmargulies

+2

@bmargulies, non c'è 'public' e l'override è solo un disturbo facoltativo. – bestsss

risposta

24

rendere il metodo pubblico

public class C extends A implements B { 

    //trying to override doSomthing... 

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

metodi di interfaccia sono sempre public

o semplicemente usare la composizione, invece di eredità

+0

Grazie a te ea tutti gli altri soccorritori. Ha risolto il problema! – rapt

+0

È possibile che una variabile sia un'istanza di classe e erediti un'interfaccia? Nel tuo esempio sarebbe qualcosa come 'new C() implementa X' assumendo che X sia l'interfaccia – Vadorequest

+1

@Vadorequest che implementa o che si estenda a livello di classe e non al livello di istanza. Per implementare anche X devi aggiungerlo all'elenco delle interfacce: 'public class C estende A implementa B, X {...}' –

2

Questo ha a che fare con la visibilità. Si sta utilizzando la visibilità di default (senza modificatore) in C per myMethod ma è necessario che sia public in base all'interfaccia B.

Ora si potrebbe pensare che hai usato la visibilità default per tutti loro, dal momento che in nessuno dei due A, B, nè C ti è esplicitamente selezionare una delle public, private o protected. Tuttavia, l'interfaccia utilizza public indipendentemente dal fatto che lo si indichi esplicitamente.

+0

Grazie! Lo sapevo davvero ma mi hai ricordato. – rapt

0

È sufficiente eseguire il metodo public in caso di override in C.

7

Il metodo doSomethis() è pacchetto-privato in classe A:

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

Ma è pubblico nell'interfaccia B:

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

compilatore sta prendendo il doSomething() ereditata dal C da A che è pacchetto-privato come l'implementazione di quello in B che è pubblico. Ecco perché si lamenta -

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

Perché, mentre preponderante un metodo non si può restringere il livello di accesso del metodo.

soluzione è facile, in classe C -

@Override 
public int doSomthing(int x) { 
    // ... 
} 
Problemi correlati