web-dev-qa-db-ja.com

Java:クラスを拡張し、同じメソッドを持つインターフェースを実装する

おそらく次のことはできません(コンパイルエラーが表示されます:「継承されたメソッドA.doSomthing(int)はBのパブリック抽象メソッドを非表示にできません」):

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

AもBも変更できないと仮定すると、私の質問は、AとBの両方から継承するようにCを定義することはできますか?およびB)。

そうでない場合、これをどのように回避しますか?

ありがとう!

23
rapt

メソッドを公開する

public class C extends A implements B {

    //trying to override doSomthing...

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

インターフェイスメソッドは常にpublic

または単に継承の代わりに構成を使用する

27
ratchet freak

メソッドdoSomethis()は、クラスAではpackage-privateです。

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

ただし、インターフェイスBではpublicです。

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

コンパイラは、package-privateであるAからCによって継承されたdoSomething()を、B内のpublic。それが文句を言う理由です-

「継承されたメソッドA.doSomthing(int)は、Bのパブリック抽象メソッドを非表示にできません」

なぜなら、メソッドをオーバーライドする一方で、アクセスレベルを絞り込むことはできないからですメソッドの。

解決策は簡単、クラスCでは-

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

これは可視性に関係しています。 defaultCmyMethod(修飾子なし)可視性を使用していますが、インターフェースpublicに応じてBにする必要があります。

defaultABのいずれも明示的にCのいずれかを選択しなかったため、これらすべてにpublic可視性を使用したと考えるかもしれません。 、private、またはprotected。ただし、明示的に指定するかどうかに関係なく、インターフェイスはpublicを使用します。

2
Michael McGowan

publicでオーバーライドするときにメソッドCを作成するだけで済みます。

0
Costi Ciudatu