2015-01-14 1 views
15

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

Сценарий 1: Я - объект.

class Test { 

    public static void main (String[] args) { 

     Test t = new Test(); 
     byte b_var = 10; 
     t.do_the_test(b_var); 
    } 

    public void do_the_test(Character c) { 

     System.out.println("I am a character."); 
    } 

    public void do_the_test(Integer i) { 

     System.out.println("I am an integer."); 
    } 

    public void do_the_test(Object obj) { 

     System.out.println("I am an object."); 
    } 
} 

Сценарий 2 Выход: Я целое.

class Test { 

    public static void main (String[] args) { 

     Test t = new Test(); 
     byte b_var = 10; 
     t.do_the_test(b_var); 
    } 

    public void do_the_test(char c) { 

     System.out.println("I am a character."); 
    } 

    public void do_the_test(int i) { 

     System.out.println("I am an integer."); 
    } 

    public void do_the_test(Object obj) { 

     System.out.println("I am an object."); 
    } 
} 

ответ

18

Java Language Specification говорит, что это метод разрешения о подписи:

На первом этапе (§15.12.2.2) выполняет разрешение перегрузки, не допуская бокс или распаковки преобразование, или использование метода переменной валентности вызова , Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до второй фазы.

В вашем втором случае подпись метода с участием int применима без автобоксинга, но с расширением числового преобразования. В первом случае для достижения подписи Integer потребуется как расширение конверсии , так и. однако, Java либо autoboxing или примитивное преобразование, никогда оба.

+0

Можете ли вы объяснить, как примитивный тип может быть сопоставлен классу Object в качестве суперкласса примитивного типа, является нулевым, а не Object, а затем как он сопоставляет вызов метода с использованием объекта как параметра. – Jayesh

+0

Он сначала преобразуется в объект путем преобразования автобоксинга. –

-3

При выборе метода выбираются аргументы, наиболее близкие к переданному параметру.

В первом случае числовое значение имеет три класса, которые он не может напрямую отображать. Поскольку Object является супердетой всех классов, он соответствует fn [Object] и, следовательно, Я - объект.

Во втором случае вызов функции нашел свою ближайшую совпадающую функцию с fn [integer], по результату в виде Я - целое число.

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