おそらく次のことはできません(コンパイルエラーが表示されます:「継承されたメソッド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)。
そうでない場合、これをどのように回避しますか?
ありがとう!
メソッドを公開する
public class C extends A implements B {
//trying to override doSomthing...
public int myMethod(int x) {
return doSomthingElse(x);
}
}
インターフェイスメソッドは常にpublic
または単に継承の代わりに構成を使用する
メソッド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) {
// ...
}
_
これは可視性に関係しています。 default
のC
でmyMethod
(修飾子なし)可視性を使用していますが、インターフェースpublic
に応じてB
にする必要があります。
default
、A
、B
のいずれも明示的にC
のいずれかを選択しなかったため、これらすべてにpublic
可視性を使用したと考えるかもしれません。 、private
、またはprotected
。ただし、明示的に指定するかどうかに関係なく、インターフェイスはpublic
を使用します。
public
でオーバーライドするときにメソッドC
を作成するだけで済みます。