你如何声明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。