Probably the following cannot be done (I am getting a compilation error: "The inherited method A.doSomthing(int) cannot hide the public abstract method in 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);
}
}
Assuming I am allowed to change neither A nor B, my question is can I somehow define C in such a way that it will inherit from both A and B (suppose that it is required for some framework that C will be both an instance of A and B).
Or if not, how would you work around this?
Thanks!
The method
doSomethis()
is package-private in class A:But it is public in the interface B:
Compiler is taking the
doSomething()
inherited by C from A which is package-private as the implementation of the one in B which is public. That's why it's complaining -Because, while overriding a method you can not narrow down the access level of the method.
Solution is easy, in class C -
make the method public
interface methods are always
public
or just use composition instead of inheritance
This has to do with visibility. You are using
default
(no modifier) visibility inC
formyMethod
but it needs to bepublic
according to the interfaceB
.Now you might think you used the
default
visibility for all of them, since in neitherA
,B
, norC
did you explicitly select one ofpublic
,private
, orprotected
. However, the interface usespublic
whether or not you explicitly indicate so.Simply making the method
public
when overriding it inC
will do.