Примитив == оболочка преобразуется в примитив == примитив или оболочка == оболочка?

Я предполагаю, что преобразования, описанные в jls, сортируются в соответствии с приоритетом. Первый имеет большой приоритет.

JLS

Таким образом, я решил, что Boxing имеет больший приоритет, чем Unboxing, Я решил проверить это предположение.

исследовать следующий код:

public class BoxingUnboxingPriority {
    public static void main(String [] args){
        int sn = 1000;
        Integer isn1= new Integer(sn);
        System.out.println(sn == isn1 );

    }
}

из:

true

Что такое бокс? просто new Integer(primitiveInt)

Я немного поменял код

int sn = 1000;
Integer isn1= new Integer(sn);
Integer isn2= new Integer(sn);
System.out.println(isn1 == isn2 );

из:

false

Таким образом, я сделал ошибку.

Пожалуйста, уточните мне этот вопрос.

4 ответа

Решение

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

Это неверно. JLS не говорит о "приоритетах" для конверсий. Это не признанная концепция.

Фактически, преобразования, которые могут быть применены, документируются в каждом конкретном случае для каждого оператора и так далее. Таким образом, JLS 15.21.1 говорит, что == или же != для числовых типов приводит к "двоичному числовому продвижению" обоих операндов. А в JLS 5.6.2 говорится, что двоичное числовое продвижение состоит из "преобразования без распаковки" ( 5.1.8), за которым следует "расширение примитивного преобразования" ( 5.1.2) и, наконец, "преобразование набора значений" ( 5.1.3).

В отличие от этого, JLS 15.21.3 говорит, что при сравнении двух ссылок используется == или же !=, никаких рекламных акций или конверсий не происходит.

(На самом деле, распространенной ошибкой начинающих Java является использование == сравнить два Integer объекты, а не equals(Object) метод. И, вероятно, именно этот "вопрос", на который вы смотрите, пытается проверить ваше понимание...)

Соответствующий раздел:

15.21.1. Операторы числового равенства == и!=

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

Так:

Integer o = 1;
int i = 1;
boolean b = o == i;

...эквивалентно:

boolean b = o.intValue() == i;

Там, где оба имеют тип Integer, ни один из них не является простым числовым типом - они оба являются объектными ссылками.

Когда вы используете примитив с объектом Wrapper, этот объект-оболочка будет распакован, а затем будет применена операция.

В вашем первом случае, когда вы сравниваете sn с isn1, isn1 будет распакован и значение будет сопоставлено. Итак, вы получили true,

Во втором случае isn1, isn2 два разных объекта, так == оператор даст false

int sn=1000; Integer isn1=new Integer(sn); System.out.println(sn == isn1 );

будет преобразован в

System.out.println(sn == isn1.intValue());

при сравнении примитива с оболочкой объект-оболочка сначала будет распакован, а затем сравнен. Объект-обертка intValue() возвращает int, так что результат примитивного сравнения true.

Integer isn1= new Integer(sn);

Integer isn2= new Integer(sn); System.out.println(isn1 == isn2 );

// сравниваем два разных объекта так ложно.

Другие вопросы по тегам