Почему компилятор Java по умолчанию рассматривает длинный тип данных как двойной, а не как целое число? - PullRequest
0 голосов
/ 26 мая 2020

Я новичок в Java, и я наткнулся на это при тестировании кода. Почему Java передает x (типа данных long) в функцию, которая принимает параметры типа double вместо функции с целочисленными параметрами. Я был бы признателен, если бы кто-нибудь любезно объяснил мне, почему (хотя это может быть простой вопрос для большинства из вас!) Заранее спасибо!

public class Hello {
public static void main (String [] args) {
    long x=1;
    System.out.println("Before calling the method, x is "+x);
    increase(x);
    System.out.println("After calling the method, x is "+x);
    System.out.println();

    double y=1;
    System.out.println("Before calling the method, y is "+y);
    increase(y);
    System.out.println("After calling the method, y is "+y);


}

public static void increase(int p) {
    p+=1;
    System.out.println(" Inside the method is "+p);

}

public static void increase(double p) {
    p+=2;
    System.out.println(" Inside the method is "+p);

}   }

Ответы [ 2 ]

6 голосов
/ 26 мая 2020

Преобразования, разрешенные при вызове метода, определены в главе 5 JLS. Неявные примитивные преобразования должны иметь расширение , то есть не приводить к потере величины (хотя в случае long to double, может привести к потере точности.) Каждый вид контекста имеет разные правила для набора полигональных выражений и допускает преобразования в некоторых из вышеперечисленных категорий, но не в других. Контексты следующие:

...

Строгие контексты вызова (§5.3, §15.9, §15.12), в которых аргумент привязан к формальному параметру конструктора или метода. Могут происходить расширяющиеся примитивные, расширяющиеся ссылки и неконтролируемые преобразования.

Свободные контексты вызова (§5.3, §15.9, §15.12), в которых, как и строгие контексты вызова, аргумент привязан к формальному параметру. Вызов метода или конструктора может предоставить этот контекст, если не может быть найдено применимое объявление с использованием только строгих контекстов вызова. В дополнение к расширяющим и непроверенным преобразованиям, этот контекст позволяет выполнять преобразования упаковки и распаковки.

JLS 11 Глава 5

Преобразование от long к int - это сужение примитивное преобразование, так как это может привести к потере информации о величине. Таким образом, он не вызывается, если вы сначала явно не приведете к (int).

1 голос
/ 26 мая 2020

У вас есть 2 перегруженных метода для увеличения () с int и double в качестве входных параметров. Также вы передаете входной параметр как длинный тип.

В Java UpCasting происходит в формате ниже.

byte -> short -> int -> long -> float -> double

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

Следовательно, длинное значение может быть принято методом, имеющим двойное значение в качестве входного параметра.

Пожалуйста, go через URL-адреса ниже. Вход для преобразования типа Java Преобразование типа - Oracle Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...