Как вы объявляете x и y так, чтобы x + = y выдавал ошибку компиляции и x = x + y не?
Я столкнулся с этим вопросом в интервью и не смог найти решение. Я знаю, что наоборот можно сделать, как показано в Что означает "+ =" оператор на Java?
Итак, вопрос был как ниже.
..... x = .....;
..... y = .....;
x += y; //compile error
x = x + y; //works properly
Ответы
Ответ 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.