让我们看下面的例子:
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)
,因此它与其他方法没有冲突,但是确实将输入限制为Paintable
和Printable
的实现者。(Guava had to use this trick用于带有
Joiner
和Iterator
的Iterable
,因为尽管这是一个糟糕的主意,但一些邪恶的类同时实现了这两种方法。)关于java - 接口(interface)-解决模棱两可的错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11762418/