Как вы объявляете x и y так, что x + = y дает ошибку компиляции, а x = x + y нет? - PullRequest
55 голосов
/ 15 ноября 2011

Я столкнулся с этим вопросом в интервью и не смог найти решение.Я знаю, что наоборот можно сделать, как показано в Что делает оператор "+ =" в Java?

Так что вопрос был как ниже.

..... x = .....;
..... y = .....;

x += y; //compile error
x = x + y; //works properly

Ответы [ 4 ]

55 голосов
/ 15 ноября 2011

Попробуйте этот код

Object x = 1;
String y = "";

x += y; //compile error
x = x + y; //works properly

не совсем уверен, почему это работает, но компилятор говорит

Оператор + = не определен для типа аргумента (ов) Object,Строка

, и я предполагаю, что для второй строки toString вызывается для объекта.

РЕДАКТИРОВАТЬ:

Это имеет смысл как +=Оператор не имеет смысла для общего объекта.В моем примере я приводил int к объекту, но он зависит только от x, имеющего тип Object:

Object x = new Object();

Хотя он работает, только если x - это объект, так что я на самом деле думаю, что этоБолее того, String является прямым подклассом Object.Это не удастся для x + y:

Foo x = new Foo();

для других типов, которые я пробовал.

3 голосов
/ 15 ноября 2011

Это невозможно.

X x = ...;
Y y = ...;

x += y;         //1
//equivalent to
x = (X) (x+y);  //2

x = x+y;        //3

Предположим, тип x+y равен Z. # 2 требует преобразования приведения из Z в X;# 3 требует преобразования присваивания из Z в X. «Преобразования приведения более инклюзивны, чем преобразования присвоения» (1).Следовательно, если # 3 допустимо, # 2 допустимо, а # 1 допустимо.

С другой стороны, возможно, что # 1 допустимо, но # 3 недопустимо, например

    byte x = 0;
    int y  = 1;
    x+=y;     // ok, x=(byte)(x+y), cast int to byte is allowed.
    x = x+y;  // error, assign int to byte

Эта информация вообще бесполезна;это недостаток Java, делающий такие удивительные различия.

(1) http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5

2 голосов
/ 16 ноября 2011
int  i = 5;
String s = "a";
System.out.println(i+=s);  //Error
System.out.println(i+s);   // No error

В основном, работает для любого объекта или любой нестрочной комбинации примитива и строки.

Интересно, какая это была компания?:)

1 голос
/ 21 ноября 2011

Эта вещь не всегда даст вам ошибку компиляции

Если вы делаете сглаживание следующим образом:

class A{
public static void main(String args[]){
    String x = "10";
    String y = "s";
    x += y;
    System.out.println(x);
}
}

Это будет нормально работать

, даже если вы делаете

class A{
public static void main(String args[]){
    int x = 10;
    float y = 11.5F;
    x += y;
    System.out.println(x);
}
}

это будет работать правильно.

Но если вы возьмете x и y двух разных типов переменных, таких как:

class X{
 }
class A{
public static void main(String args[]){
    X x = new X();
    float y = 11.5F;
    x += y;
    System.out.println(x);
}
}

В таких случаях компиляция не удастся.

* Даже вы можете объединять любые int, float и т. Д. С помощью String.

...