Почему java Integer wrapper == примитивная двойная компиляция при назначении примитива int двойной обёртке не допускается - PullRequest
2 голосов
/ 21 сентября 2019

Следующий код прекрасно компилируется и возвращает true в Java.Я читал, что java не будет выполнять два преобразования одновременно, как при присвоении буквенного значения * (1001) * int (или переменной) для ссылки Double .Так почему же это прекрасно компилируется при использовании оператора ==?

double double1 = 3.00;
Integer wInt = new Integer("3");
if(wInt == double1);

1 Ответ

6 голосов
/ 21 сентября 2019

Как и другие математические операторы, такие как +, оператор == выполняет двоичное числовое продвижение для своих операндов.

Когда оператор применяет двоичное числовоеПовышение до пары операндов, каждый из которых должен обозначать значение, которое может быть преобразовано в числовой тип, применяются следующие правила в следующем порядке:

  1. Если какой-либо операнд имеетссылочный тип, он подвергается преобразованию без распаковки (§5.1.8).

  2. Расширяющее примитивное преобразование (§5.1.2) применяется для преобразования одного или обоих операндов ...

Компилятор сначала распаковывает Integer в int, затем расширяет int до double.Он выполнит оба, если сначала произойдет распаковка.

Java выполнит оба преобразования неявно для многих операторов:

Двоичное числовое продвижение выполняется для операндов некоторых операторов:

  • Мультипликативные операторы *, / и % (§15.17)

  • Операторы сложения и вычитания для числовых типов + и - (§15.18.2)

  • Операторы числового сравнения <, <=, > и >= (§15.20.1)

  • Операторы числового равенства == и != (§15.21.1)

  • Целочисленные побитовые операторы &, ^ и | (§15.22.1)

  • В некоторых случаях условный оператор ? : (§15.25)

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