2013-05-27 2 views
6

Я занимаюсь самообучением летом, и я столкнулся с этой проблемой, о которой я не знаю, и мне было интересно, сможет ли кто-нибудь помочь. Я не уверен в последнем номере, но я включил свои предыдущие ответы, если кто-то захочет их проверить. Это не домашнее задание для любого класса, я просто хочу убедиться, что я понимаю, что я делаю, прежде чем двигаться дальше.Юридические вызовы и определение перегруженных функций в Java

Я рассматриваю следующие определения:

1. void m (Object o, long x, long y) 
2. void m (String s, int x, long y) 
3. void m (Object o, int x, long y) 
4. void m (String s, long x, int y) 

которые эти заявления:

Object o; 
String v; 
int a; 
long b; 

и я Проверив эти вызовы:

m(v,a,b); Calls 2, because it is the most specific. 
m(v,a,a); Not legal, because 2 and 4 could both be called (not specific enough). 
m(v,b,a); Calls 4, because it is the most specific. 
m(v,b,b); Calls 1, because it is the only one that will fit (long cannot shorten to int). 
m(o,b,b); Calls 1, similar reasoning as above answer. 
m(o,a,a); Unsure. I'm not sure of the precedence. 

Заранее спасибо!

+0

Вы попробовали сами? Если вопрос * почему * перегрузки выбраны, это одно; но если вопрос заключается в том, чтобы получить выбор, это очень легко проверить. – yshavit

+0

Это вопрос обоих, но вы правы, я даже не подумал протестировать его. Было бы очень легко понять. Благодаря! –

ответ

2

Это простой случай с «наиболее конкретными». Вариант 3 выбран по той же причине, что ваш второй вызов является незаконным. m(v,a,a) не может выбирать между m(String,long,int) и m(String,int,long), потому что они одинаково специфичны. Для каждого из них требуется одно расширенное преобразование одного из аргументов. m(o,a,a), с другой стороны, может выбирать между m(Object,long,long) и m(Object,int,long). Один из них требует двух расширяющихся преобразований. Другой требует только одного, что делает его наиболее конкретным.

+0

Спасибо большое! Я должен был понять, что Object не может соответствовать String. Если бы я понял, что меня сразу приведут к 3. –

2

Последний вызов будет называться 3. В качестве первого аргумента Object, он может выбрать только один из методов с Object в качестве первого аргумента, так что в качестве опций остается 1 или 3. Третий аргумент int вписывается в long, что является законным в обоих случаях. Второй аргумент может быть точно установлен на 3, тогда как он должен быть расширен, чтобы вписаться в 1. Компилятор отдает предпочтение точному сопоставлению по расширению.

Ваши предыдущие ответы верны.

+1

Большое спасибо! Я не понимал, что Object может только соответствовать Object, но String может соответствовать Object/String. Как только вы это указали, я сразу понял, почему это 3. –

0

m (v, b, b); Вызывает 1, потому что это единственный, который будет соответствовать (длинный не может сократить до int).

Другая причина для этого вызова 1 связана с полиморфизмом и иерархией, основанной на одиночной иерархии Java. Строка (или любой объект) является потомком класса Object. Любой метод, который принимает объект как аргумент, может взять строку - сущность полиморфизма.

Смежные вопросы