解决模棱两可的错误

解决模棱两可的错误

让我们看下面的例子:

public class BothPaintAndPrintable implements Paintable,Printable{
    public void print() {}
    public void paint() {}
}
public interface Paintable {
    public void paint();
}

public interface Printable {
    public void print();
}

public class ITest {
    ArrayList<Printable> printables = new ArrayList<Printable>();
    ArrayList<Paintable> paintables = new ArrayList<Paintable>();
    public void add(Paintable p) {
        paintables.add(p);
    }
    public void add(Printable p) {
        printables.add(p);
    }
    public static void main(String[] args) {
        BothPaintAndPrintable a= new BothPaintAndPrintable();
        ITest t=new ITest();
        t.add(a);//compiliation error here
    }
}

如果我想将BothPaintAndPrintable实例添加到每个ArrayList中怎么办?
一种方法是使用BothPaintAndPrintable参数重载该方法,但是我正在尝试寻找替代方法,因为这样做可能会降低代码的可重用性。有人有其他想法吗?

最佳答案

您需要第三次重载:

public <T extends Object&Paintable&Printable> void add(T t) {
  paintables.add(t);
  printables.add(t);
}

这样就可以擦除add(Object),因此它与其他方法没有冲突,但是确实将输入限制为PaintablePrintable的实现者。

(Guava had to use this trick用于带有JoinerIteratorIterable,因为尽管这是一个糟糕的主意,但一些邪恶的类同时实现了这两种方法。)

关于java - 接口(interface)-解决模棱两可的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11762418/

10-10 13:30