У меня есть несколько вопросов относительно того, какой перегруженный метод будет вызываться в определенных случаях.
Случай 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
, он напечатает «Объект».Однако, что если я передам ему InputStream?Это становится более запутанным, если я передаю ему что-то вроде BufferedInputStream.Будет ли это вызывать Object one, InputStream one или FilterInputStream one?Имеет ли значение порядок появления методов?
Случай 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);
}
Будет ли это Call someMethod (BlockingQueue) или someMethod (Deque)?
Случай 3:
YouМожно объединить эти два с этим:
public void someMethod(Queue q){
//...
}
public void someMethod(Deque q){
//...
}
public void someMethod(List p){
//...
}
public void someCaller(){
someMethod(new LinkedList());
}
Тот же вопрос: someMethod (очередь), someMethod (Deque) или someMethod (список)?
Случай 4:
Вы также можете усложнить ситуацию, введя два аргумента:
public void someMethod(Collection c1, List c2){
//...
}
public void someMethod(List c1, Collection c2){
//...
}
public void someCaller(){
someMethod(new ArrayList(), new ArrayList());
}
Будет ли это вызывать someMethod (Коллекция, Список) или наоборот?
Случай 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)?