Group
实现了Figure
接口,此外还声明了一个公共addFigure
方法。为什么我不能在我的addFigure
组对象上调用g1
方法?
public interface Figure {
void draw();
}
public class Group implements Figure {
private List<Figure> figures;
public Group(Figure... figures) {
this.figures = new ArrayList<>();
for (Figure f : figures) {
this.figures.add(f);
}
}
public void addFigure(Figure f) {
this.figures.add(f);
}
@Override
public void draw() {
for (Figure f : figures) {
f.draw();
}
}
}
public class Main {
public static void main(String[] args) {
Figure r1 = new Rectangle();
Figure r2 = new Rectangle();
Figure r3 = new Rectangle();
Figure g1 = new Group(r1, r2);
Figure g2 = new Group(r2, r3);
g1. // <- only `draw()` availabe, no `addFigure(Figure)`
}
}
答案 0 :(得分:0)
正在发生的事情是您在实例化Figure
实例时定义了Group
类型。
您的Figure
接口定义了draw
方法,但没有addFigure
方法。该方法在Figure
接口的实现中定义。
通过接口创建实例时,即使实际实例属于实现类型,您也必须绑定到该接口中定义的方法。结果,您需要将实例强制转换为Group
,它将可以正常工作。
答案 1 :(得分:0)
您的变量g1
是静态类型Figure
。编译器无法知道使用了哪种接口实现。定义变量时,请使用所需的类型,例如Group g1 = new Group(...)
。然后,您将可以在实例上调用addFigure
:
Figure r1 = new Rectangle();
Figure r2 = new Rectangle();
Figure r3 = new Rectangle();
Group g1 = new Group(r1, r2);
Group g2 = new Group(r2, r3);
g1.addFigure(r3);
您可以在使用Group
的任何地方使用Figure
(请考虑向下转换),但不能反过来使用({转换})