Подтвердить что ты не робот

Как вы объявляете x и y так, чтобы x + = y выдавал ошибку компиляции и x = x + y не?

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

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

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

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

Ответ 1

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

Object x = 1;
String y = "";

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

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

Оператор + = есть undefined для типа аргумента (ов) Object, String

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

EDIT:

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

Object x = new Object();

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

Foo x = new Foo();

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

Ответ 2

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

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

Ответ 3

int  i = 5;
String s = "a";
System.out.println(i+=s);  //Error
System.out.println(i+s);   // No error

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

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

Ответ 4

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

Если вы делаете что-то вроде этого:

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.