Запрос относительно оператора равенства (совместимые операнды) в JAVA

1

Я новичок в JAVA и проходил через оператора равенства. Попробовав несколько комбинаций операндов, я немного смущен относительно того, что именно является определением совместимых операндов для оператора равенства (==) в Java.

int x = 23;
if (x == 23.3f) {   // compiler accepts it. (may be because both are primitives)

int x = 23;     
Double d = new Double(23.3); 
if (x == d) {    // compiler accepts it. (may be compatible pair of primitive and object reference)

int x = 23;
String s = "hello";
if (x == s)   // compiler throws error  - incompatible operands for == operator.

Итак, мне кажется, должно быть какое-то формальное определение совместимых операндов для оператора равенства. Пожалуйста, помогите мне в разъяснении этого сомнения.

  • 0
    для строки есть метод .equals . и в вашем последнем, if ясно, что они несовместимы, потому что вы пытаетесь сравнить Object (String) с примитивным типом (int, long, double ...)
  • 0
    Я понимаю, что .equals есть, но мой запрос специально касается ==. если вы видите мой второй пример, я сравниваю примитив с Object (Double.) и компилятор принимает его.
Теги:
equality-operator

3 ответа

0
Лучший ответ
  1. Компилятор принимает его, потому что x и 23.3f имеют примитивные числовые типы. И сравнение вернет false.

  2. Компилятор принимает это, потому что java unboxes Double object для double примитива при сравнении.

  3. Компилятор не может принять его, потому что x является примитивным числовым типом, а s является ссылкой на экземпляр класса String. Невозможно сопоставить номер примитива и ссылку на объект.

  • 0
    Что касается # 2, распаковка всегда происходит, когда ваш другой операнд примитивен?
  • 0
    согласно официальному определению: Autoboxing (and unboxing) is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. примеры типов примитивов и соответствующих классов-оболочек объектов: int и Integer , double и Double и т. д. Для сравнения, если один операнд является экземпляром класса-оболочки, а другой операнд является примитивным типом, то происходит распаковка. Более того, если оба операнда являются экземплярами класса-оболочки, то есть Integer, тогда java сравнивает значения этих объектов, а не ссылок.
Показать ещё 2 комментария
1

Для

int x = 23;
if (x == 23.3f) 

Если вы посмотрите на байтовый код с помощью javap -v, int будет преобразован в float. т.е. i2f будет вызываться, а затем они будут сравниваться как 2 значения float с использованием fcmpl.

public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=2, Args_size=1
   0:   bipush  23
   2:   istore_1
   3:   iload_1
   4:   i2f       // The line of interest. Converts int to float.
   5:   ldc     #16; //float 23.3f
   7:   fcmpl     // compare two floats
   8:   ifne    11
   11:  return

В третьем случае вы сравниваете примитив с объектом (String), что невозможно.

0

Строки - это объекты. == сравнивает объекты по ссылке, а не по их внутреннему значению. Все остальные (int, double) сравниваются в == помощью ссылок на объекты, поэтому в случае строки они не соответствуют так для строки, мы должны .equals u .equals java чувствителен к регистру, поэтому, сравнивая строку u, необходимо позаботиться о Case of strings string

Ещё вопросы

Сообщество Overcoder
Наверх
Меню