Сравнение целых и целых чисел

Я новичок в java, Я сейчас изучаю не примитивный тип Integer в java, Я знаю, что следующее сравнение недопустимо и выдает ошибку компиляции -

String str = "c";
Char chr = 'c';
if(str == chr) return true;

Приведенный выше фрагмент кода дает мне ошибки - "Test.java:lineNumber: несопоставимые типы: java.lang.String and char".

Но я обнаружил, что следующий фрагмент кода прекрасно компилируется -

int a = 1234;
Integer aI = 1234;
if(a==aI) return true; 

Вот, a примитивен и aI не примитивно Так как они сравнимы? Я новичок в программировании, может быть, есть что-то, чего я не знаю.

Спасибо

3 ответа

Решение

Это называется unboxing, Здесь aI не является примитивным / ссылочным типом. Здесь Integer является оберткой примитива int. Это дает некоторые дополнительные простые в использовании манипуляции над примитивом int. Каждый тип примитива, например, (логический, байт, символ, короткий, int, long, float, double) имеет соответствующий тип оболочки (Boolean, Byte, Character, Short, Integer, Long, Float, Double).

Так когда a по сравнению с aI, первый aI распаковывается и становится примитивным int, а его значение сравнивается с примитивным int. Это означает, что это эквивалентно -

int a = 1234;
Integer aI = 1234;
int a2 = aI.intValue();
if(a == a2) return true;

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

Второй фрагмент демонстрирует распаковку конверсии. Конверсионное преобразование позволяет неявно преобразовывать тип примитива в определенный тип оболочки объекта, например int <-> Integer,

При сравнении с == оператор, если один операнд является примитивным типом, а другой - таким типом обертки, выполняется преобразование распаковки, чтобы можно было сравнить 2 значения примитива.

Первый фрагмент не компилируется, потому что между боксом / распаковкой нет взаимосвязи String а также char - соответствующие отношения Character <-> char,

Раздел 5.1.8 JLS определяет все преобразования для распаковки:

  • От типа Boolean к типу Boolean
  • От типа байта к типу байта
  • От типа короткого до типа короткого
  • От типа Character к типу char
  • От типа Integer до типа int
  • От типа Long к типу long
  • От типа Float к типу float
  • От типа Double до типа double

Раздел 5.1.7 определяет все преобразования бокса, все из которых являются обратными вышеописанным.

В первом случае два типа данных различны. Поэтому их нельзя сравнивать. А во втором случае два типа данных тоже разные, но обертка Integer сделан для поддержки примитива int, Таким образом, JVM автоматически выполняет преобразование оболочки (распаковка) Integer в int а потом сравни. Так на самом деле во втором случае два примитивных int сравниваются друг с другом в конце.

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