【发布时间】:2010-10-17 02:58:49
【问题描述】:
我有一些关于在某些情况下会调用哪个重载方法的问题。
案例一:
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 它将打印“对象”。但是,如果我给它传递一个 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)?
【问题讨论】:
标签: java inheritance overloading