>我有以下方法:
private void setFilledAndAdd(Shape obj, Color col, int x, int y) {
obj.setFilled(true); // needs interface Fillable
obj.setFillColor(col);
add(obj, x, y); // needs children of Shape (or Shape itself)
}
如果我添加其中一行:
setFilledAndAdd(oval, color, x, y);
编译第 obj.setFilled(true);
行和行obj.setFillColor(col);
中的错误。因为Shape
不是Fillable
. 未为类型"形状"定义。
更改方法setFilledAndAdd
中的参数类型Fillable
(不是Shape
)会导致第 add(obj, x, y);
行中的编译时错误。在这种情况下,它需要Shape
。
我使用的所有Shape
的孩子都是Fillable
。给我一个提示,如何让这种方法工作。
谢谢。
您可以使用泛型来表示您希望具有这两个特征的对象
private <T extends Shape & Fillable> void setFilledAndAdd(T obj, Color color, int x, int y){
obj.setFilled(true); // needs interface Fillable
obj.setFillColor(color);
add(obj, x, y);
}
private void add(Shape s, int x, int y){
// whatever code you have goes here.
}
这对我来说编译得很好。
如果您可以控制Shape
和Fillable
源,我会重写,以便所有形状都可以填充(如果可能的话)。您也可以使用public abstract class FillableShape extends Shape implements Fillable
来继续使用类型系统。
否则,您可以使用类型转换,并进行运行时检查以确保形状可填充:
if(obj instanceof Fillable){
((Fillable) obj).setFilled(true);
((Fillable) obj).setFillColor(col);
add(obj, x, y);
} else {
// show an error message or something
// (or just draw the shape without filling it, if you want)
}