почему примитивный тип будет вызывать сначала, а не классы-обертки? - PullRequest
1 голос
/ 24 декабря 2010
public class A {

   public void test(Integer i) {
       System.out.println("In Wrapper Method");
   }

   public void test(int i) {
       System.out.println("In primitive Method");
   }

   public static void main(String args[]) {
       A a = new A();
       a.test(5);
   }


}

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

Спасибо,

Ответы [ 5 ]

3 голосов
/ 24 декабря 2010

Как грубое «практическое правило», Java использует метод наиболее близкого соответствия для объявленных типов выражений аргументов при выборе между различными перегрузками.В этом случае test(int i) ближе, чем test(Integer i), когда метод вызывается как test(5), поскольку для последнего требуется продвижение типа (автобокс), чтобы действительный тип аргумента был правильным.процесс принятия решения более сложен, чем этот, но в большинстве случаев работает «практическое правило».

3 голосов
/ 24 декабря 2010

В этом случае вы используете буквальное значение 5, которое является примитивом int в Java.Любой простой числовой литерал, такой как в Java, является примитивным.Для вызова другого метода вместо этого потребуется передать new Integer(5).Автобокс, представленный в Java 5, может стирать грани между ними, но они по-прежнему отличаются друг от друга.

0 голосов
/ 02 июля 2012

Вы передали 5 как примитивный тип, поэтому он вызовет метод, который принимает примитив, поэтому, если вы хотите вызвать тот, который принимает 5 как объект, вы должны сначала преобразовать его в объект как показано ниже

int a = 5;
Integer b = new integer(5);
0 голосов
/ 24 декабря 2010
a.test(5)  // test(int i)

Компилятор понимает его как примитивный тип.Если вы хотите запустить другой метод, вы должны отправить

a.test(new Integer(5)) // test(Integer i)

, потому что Java выберет наиболее подходящий метод для запуска

0 голосов
/ 24 декабря 2010

Не совсем ответ, но при перегрузке не имеет значения, какой метод вызывается. В этом случае вызов любого метода, если значением является Integer или int, результат должен быть одинаковым. Перегрузка должна использоваться только для преобразования значений в какую-либо другую форму или в качестве механизма обеспечения значений по умолчанию.

String.valueOf () является хорошим примером преобразования входных данных в строку.

...