Почему этот метод возвращает вывод? - PullRequest
0 голосов
/ 13 мая 2018
class Demo {

    public void myMethod(int a, double b, char c) {
        System.out.println("Version 1.");
    }

    public void myMethod(int a, double b, double c) {
        System.out.println("Version 2.");
    }

    public void myMethod(int a, boolean b, double c) {
        System.out.println("Version 3.");
    }

    public void myMethod(int a, boolean b, boolean c) {
        System.out.println("Version 4.");
    }

    public static void main(String[] args) {
        Demo obj = new Demo();
        obj.myMethod(1, 100, 'b');
    }

}

1 и 100 имеют тип int, а b является типом char, поэтому не должен ли результат быть ошибкой компиляции?Я не понимаю, почему он возвращает «версия 1.»

1003 * Может кто-нибудь объяснить мне, почему?

спасибо

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Во время выполнения ваш компилятор преобразует int 100 в тип double, потому что вы не оставили ему других вариантов (т. Е. Другой перегруженный метод, который принимает точно int, int и char).

Другими словами, вместо выдачи RuntimeException ваш компилятор преобразует int, который принимает меньший размер, в тип, который принимает больший размер, который в вашем случае равен double.Это автоматически выполняется без потери информации.

Это называется Расширяющее примитивное преобразование или автоматическое преобразование или неявное преобразование.

0 голосов
/ 13 мая 2018

Сценарий, который вы описали, происходит для преобразования типов в Java. Официальный java doc уже предоставил 13 категорий конверсий, которые возможны в java. Ваш также падает на одного из них, widening primitive.

Вы можете легко понять логику, если понимаете этот простой код:

int a = 12.80;
System.out.print(a);

12.80 не является целочисленным типом данных, и если 12.80 необходимо преобразовать в целое число, то компилятор должен вырезать оттуда .80, что приведет к possible lossy conversion ошибке компиляции.

Опять же, мы можем захотеть запустить другой код:

double b = 12;
System.out.print(b);

Если вы считаете, что приведенный выше код может выдать вам ошибку компиляции, то вы совершенно не правы. Потому что здесь вывод 12.0. Поскольку здесь не происходит потеря данных, int можно легко преобразовать в double.

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

Теперь, в вашем случае, 100 считается компилятором как 100.0 или что-то в этом роде, поскольку нет другого перегруженного метода с целочисленным типом данных.

Надеюсь, теперь вы понимаете.

0 голосов
/ 13 мая 2018

Значение 100 может использоваться как удвоение, это расширяющийся примитив преобразования :

байт в short, int, long, float или double

short к int, long, float или double

char к int, long, float или double

int к long, float или double

long дляfloat или double

float to double

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