2015-11-27 7 views
-8

Актуальный вопрос:Если он вызывает (1), то как я могу сделать так, чтобы он вызывал (2)? МетодыПерегрузка метода - Java

Я после подписания

public void myMethod(String myStr, MyClass myClass) {...} // (1) 

public void myMethod(Object... objects) {...} // (2) 

Где-то я делаю вызов, как

myMethod(new String("name"), new MyClass());

Какой перегруженный метод будет называться? Если он вызывает (1), то как я могу сделать это так, чтобы он вызывал (2)?

+2

почему вы не попробуете его и не увидите результаты? –

+0

Мне нужно написать длинный код, чтобы проверить это. Вот почему! \ – Junaid

+4

@Junaid huh ... Для проверки этого требуется 3 строки кода ... – assylias

ответ

5

Он будет вызывать (1), потому что алгоритм разрешения метода дает приоритет методам, которые не используют varargs.

Чтобы заставить его использовать (2), вы можете передать массив или бросить первый параметр в Object:

myMethod(new Object[] { "name", new MyClass() }); 
//or 
myMethod((Object) "name", new MyClass()); 
+0

Я искал 'myMethod (новый Object [] {" name ", новый MyClass()});'. благодаря – Junaid

0

вложу это просто. Учитывая, что вы вызываете конструктор и передаете объект String и MyClass, он, очевидно, вызовет перегруженный метод, который принимает два аргумента, которые являются String как arg 1 и объект MyClass как arg 2.

1

В Java это берет метод, который является наиболее конкретным. Это соответствует Java JLS 15.12.2.5.

Этот документ говорит:

Если более чем один метод член является одновременно доступным и применим к вызову метода, необходимо выбрать один, чтобы предоставить дескриптор метода времени выполнения отправки. Язык программирования Java использует правило, в котором выбран наиболее специфический метод.

Если вам нужно вызвать общий метод вместо этого, я думаю, вы должны бросить каждого из параметров общего типа Object как:

myMethod((Object) "hello", (Object) new MyClass()); 

Или использовать как

myMethod(new Object[]{"name", new MyClass()}); 
Смежные вопросы