接口 - 解决模糊错误

Ofe*_*Ron 5 java interface

让我们看看下面的例子:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我希望将BothPaintAndPrintable实例添加到每个ArrayLists,该怎么办?一种方法是使用BothPaintAndPrintable参数重载方法,但我正在尝试查看替代方法,因为这样做可能会降低代码的可重用性.有没有人有另一个想法?

Lou*_*man 7

你需要第三次重载:

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

这使得擦除add(Object),所以它不会与其他方法相冲突,但它确实限制了两者的输入的实现者PaintablePrintable.

(番石榴只好用这一招Joiner使用IteratorIterable,因为有些邪恶类在那里实现两者,即使它是一个可怕的想法.)

  • @OfekRon,此解决方案在您的ITest和BothPaintAndPrintable类之间没有耦合.它也使得任何实现Paintable和Printable接口但不是BothPaintAndPrintable对象的类实现都能正常工作. (3认同)
  • 这实际上并不需要您预先指定哪些类都是"可绘制"和"可打印".它适用于实现`Paintable`和`Printable`的_any_类. (2认同)
  • @OfekRon但是你必须一次又一次地重载它,因为每个类都会重写两个接口.或者你要定义一个扩展这两个接口的接口,但它会发挥作用,路易斯说每个人都必须记住实现这个"组合接口". (2认同)