让我们看看下面的例子:
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参数重载方法,但我正在尝试查看替代方法,因为这样做可能会降低代码的可重用性.有没有人有另一个想法?
你需要第三次重载:
public <T extends Object&Paintable&Printable> void add(T t) {
paintables.add(t);
printables.add(t);
}
Run Code Online (Sandbox Code Playgroud)
这使得擦除add(Object),所以它不会与其他方法相冲突,但它确实限制了两者的输入的实现者Paintable和Printable.
(番石榴只好用这一招的Joiner使用Iterator和Iterable,因为有些邪恶类在那里实现两者,即使它是一个可怕的想法.)