Позвольте мне попытаться ответить на этот вопрос канонически.
Вот ваши интерфейсы:
interface iA {
void fromA();
}
interface iB {
void fromB();
}
и иерархия классов.
class cX implements iA {
public void fromX() {}
public void fromA() {} // to implement iA
}
class cY extends cX implements iB {
public void fromY() {}
public void fromB() {} // to implement iB
}
Обратите внимание, что cY
также неявно implements iA
- он передается от наследования от cX
.
Теперь давайте посмотрим, что действительно.
cY cy = new cY();
cy.fromA(); // valid - cY extends cX implements iA
cy.fromB(); // valid - cY implements iB
cy.fromX(); // valid - cY extends cX
cy.fromY(); // valid - cy is a cY
cX cx = new cY(); // valid - cY extends cX
cx.fromA(); // valid - cx implements iA
cx.fromB(); // INVALID - cX does not implement iB. The compiler doesn't know cx is actually a cY instance.
cx.fromX(); // valid - cY extends cX
cx.fromY(); // INVALID - cX is not a cY
iA ia = new cY(); // valid cY extends cX implements iA
ia.fromA(); // valid - fromA() is an iA method
ia.fromB(); // INVALID - iA is not a cY
ia.fromX(); // INVALID - iA does not have that method. Again, compiler doesn't know ia is a cY instance.
Поскольку вы спрашиваете о «полиморфизме» в комментариях: это часть полиморфизма:
iA v = new cY(); // can assign a cY instance to an iA variable
v = new cX(); // can assign a cX instance to an iA variable
Это также причина, по которой вы сейчас не можете назвать v.fromX()
или v.fromY()
; v
также может быть назначен, поэтому доступен только общий знаменатель, а именно методы iA
.