Почему («str» x == y) компилируется только для ссылочных типов?

#java #operator-keyword #equality

#java #оператор-ключевое слово #равенство

Вопрос:

Почему оператор == ведет себя со ссылками иначе, чем с примитивными типами данных ?.

 String string1 = "myString";
String string2 = "myString";
int num1 = 10;
int num2 = 10;
System.out.println("Value is " string1==string2);   //WORKS FINE 
System.out.println("Value is " num1==num2);         //COMPILE TIME ERROR
 

Я не могу понять какую-либо логическую причину этого.

PS: Скобки внутри операторов печати намеренно не используются.
Спасибо 🙂

Комментарии:

1. Это имеет смысл, если вы думаете об == операторе, сравнивающем значения ссылок. Таким образом, во всех случаях == оператор сравнивает значения своих операндов. Кроме того, то, что у вас есть, — это проблема порядка операций, а не проблема с == оператором.

Ответ №1:

Это проблема приоритета операторов. Ваш второй оператор печати интерпретируется как:

 System.out.println(("Value is " num1)==num2);  // notice the parenthesis
 

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

 System.out.println("Value is "   (num1==num2));  // compiles
 

Приоритет операторов Java описан в Operators .

Теперь, это:

 // original:
System.out.println("Value is " string1==string2);

// equivalent to:
System.out.println(("Value is " string1)==string2);
 

работает, потому "Value is " string1 что это сама строка, поэтому ее можно сравнить с string2 with == .

Комментарии:

1. Привет @arshajii. Я проверил это, попытавшись использовать System.out.println("Value is " string1==string1) . Мои предыдущие знания говорили, что это приведет к выводу true, но оно выводит false, как объясняется в вашем ответе. Спасибо 🙂

2. @PiyushSaravagi Рад, что смог помочь. 🙂

Ответ №2:

Это из operator precedence -за того, что вы не можете сравнить строку с int.

проблема 1:

 System.out.println("Value is " num1==num2);  
 

sign имеет более высокий приоритет, чем == so, поэтому он будет выполняться первым, а затем == выполняется

Итак, после выполнения это результат:

  System.out.println("Value is 10"==num2);  //num1 is appended to the string
 

проблема 2:

 "Value is 10"==num2
 

вот где возникает ошибка компиляции, string нельзя сравнить с int .

решение:

если вы хотите сначала сравнить int, вам нужно заключить его в круглые скобки, чтобы избежать ошибки во время компиляции

 System.out.println("Value is "  (num1==num2));