创建通用方法以适应接口和通用父类



>我有以下方法:

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.
}

这对我来说编译得很好。

如果您可以控制ShapeFillable源,我会重写,以便所有形状都可以填充(如果可能的话)。您也可以使用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)
}

相关内容

  • 没有找到相关文章

最新更新