webentwicklung-frage-antwort-db.com.de

Java: Erweiterung einer Klasse und Implementierung einer Schnittstelle, die dieselbe Methode verwenden

Möglicherweise kann Folgendes nicht ausgeführt werden (Ich bekomme einen Kompilierungsfehler: "Die vererbte Methode A.doSomthing (int) kann die öffentliche abstrakte Methode in B nicht ausblenden"):

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

Angenommen, ich darf weder A noch B ändern. Meine Frage ist, ob ich C irgendwie so definieren kann, dass es sowohl von A als auch von B erbt und B).

Oder wenn nicht, wie würden Sie das umgehen?

Vielen Dank!

22
rapt

machen Sie die Methode öffentlich

public class C extends A implements B {

    //trying to override doSomthing...

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

schnittstellenmethoden sind immer public

oder verwenden Sie einfach Komposition statt Vererbung

27
ratchet freak

Die Methode doSomethis() lautet package-private in Klasse A:

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

Aber es ist public in der Schnittstelle B:

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

Der Compiler nimmt das von C vererbte doSomething() von A, das package-private ist, als Implementierung des in B verwendeten public. Deshalb beschwert es sich -

"Die vererbte Methode A.doSomthing (int) kann die öffentliche abstrakte Methode in B nicht ausblenden."

Denn während Überschreiben einer Methode können Sie Zugriffsebene der Methode nicht eingrenzen.

Lösung ist einfach in Klasse C -

@Override
public int doSomthing(int x) {
    // ...
}
7
Bhesh Gurung

Das hat mit Sichtbarkeit zu tun. Sie verwenden default (kein Modifikator) für C für myMethod, aber es muss public entsprechend der Schnittstelle B sein.

Nun könnten Sie denken, Sie haben die Sichtbarkeit von default für alle verwendet, da Sie weder in A, B noch C explizit eine der Optionen public, private oder protected ausgewählt haben. Die Schnittstelle verwendet jedoch public, unabhängig davon, ob Sie dies ausdrücklich angeben.

2
Michael McGowan

Wenn Sie die Methode in public überschreiben, genügt es, die Methode C zu erstellen.

0
Costi Ciudatu