你如何声明x和y,使x + = y给出编译错误,x = x + y不是?

我在一次采访中遇到了这个问题,不能提出解决scheme。 我知道反之亦然,可以按照Java中的“+ =”运算符做什么来完成。

所以问题就像下面。

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

试试这个代码

 Object x = 1; String y = ""; x += y; //compile error x = x + y; //works properly 

不完全确定为什么这个工作,但编译器说

运算符+ =未定义为参数types(s)Object,String

我假设对于第二行,在对象上调用toString

编辑:

这是有道理的,因为+=运算符在一般对象上是没有意义的。 在我的例子中,我将一个int转换为一个Object,但是它只依赖于Objecttypes的x

 Object x = new Object(); 

它只适用于x是Object的情况,所以实际上我认为String是Object的直接子类。 这将失败的x + y

 Foo x = new Foo(); 

对于我尝试过的其他types。

这不可能。

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

假设x+y的types是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

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

基本上,适用于任何对象或任何非string基元和string组合。

我不知道这是哪家公司? 🙂

这个东西不会总是给你编译错误

如果你正在这样做smoething:

 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两个不同types的variables,如:

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

在这种情况下,它将无法编译。

*即使你可以concatinate任何int,浮点等与string。