我有一些问题,关于在某些情况下将调用哪个重载方法。
情况1:
public void someMethod(Object obj){
System.out.println("Object");
}
public void someMethod(InputStream is){
System.out.println("InputStream");
}
public void someMethod(FilterInputStream fis){
System.out.println("FilterInputStream");
}
我知道如果传入一个String
,它将打印“Object”。但是,如果我传入一个InputStream呢?如果我传递像BufferedInputStream这样的内容会更加混乱。这会调用Object、InputStream还是FilterInputStream中的一个?方法出现的顺序是否重要?
情况2:
这有点棘手,因为它利用了多个接口继承。BlockingQueue和Deque都不是对方的子/超类型,但两者都是BlockingDeque的超类型。Sun使用接口添加了多重继承,因为它们不需要树结构。BlockingDeque的声明为
public interface BlockingDeque extends BlockingQueue, Deque {
。
public void someMethod(BlockingQueue bq){
System.out.println("BlockingQueue");
}
public void someMethod(Deque bq){
System.out.println("Deque");
}
public void someCaller(){
BlockingDeque bd = new LinkedBlockingDeque();
someMethod(bd);
}
这个调用会调用someMethod(BlockingQueue)还是someMethod(Deque)?
情况3:
你可以使用以下方式将它们结合起来:
public void someMethod(Queue q){
//...
}
public void someMethod(Deque q){
//...
}
public void someMethod(List p){
//...
}
public void someCaller(){
someMethod(new LinkedList());
}
同样的问题:使用someMethod(Queue)、someMethod(Deque)或someMethod(List)?
情况4:
您也可以通过引入两个参数使事情变得非常复杂:
public void someMethod(Collection c1, List c2){
//...
}
public void someMethod(List c1, Collection c2){
//...
}
public void someCaller(){
someMethod(new ArrayList(), new ArrayList());
}
这段代码会调用someMethod(Collection, List)还是相反?
情况5:
当它们具有不同的返回类型时,情况会变得更糟:
public Class<?> someMethod(BlockingQueue bq){
return BlockingQueue.class;
}
public String someMethod(Deque bq){
return "Deque";
}
public void someCaller(){
BlockingDeque bd = new LinkedBlockingDeque();
System.out.println(someMethod(bd));
}
这些可能会变得相当糟糕。在这种情况下,someCaller会打印什么? someMethod(BlockingQueue).toString()还是someMethod(Deque)?