我在面试中遇到了这个问题,但是无法想出解决方案。我知道相反的情况可以像 Java中的“+=”运算符是什么意思? 中所示那样实现。
问题如下:
..... x = .....;
..... y = .....;
x += y; //compile error
x = x + y; //works properly
我在面试中遇到了这个问题,但是无法想出解决方案。我知道相反的情况可以像 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
我不太确定为什么这能工作,但编译器报错:
参数类型为Object,String时,运算符+=未定义
所以我猜第二行代码是在 Object 上调用了 toString 方法。
编辑:
这很有意义,因为对于一个普通的 Object,+= 运算符是没有意义的。在我的示例中,我将 int 强制转换为 Object,但这取决于 x 的类型为 Object:
Object x = new Object();
只有当x
是Object时才有效,所以我认为更确切的说是String是Object的直接子类。这个方法在x + y
时会失败:
它仅适用于x
是Object, 因此我认为String更准确的是直接继承自Object。但是这将无法处理x + y
的情况:
Foo x = new Foo();
对于我尝试过的其他类型。
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 也合法。 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
int i = 5;
String s = "a";
System.out.println(i+=s); //Error
System.out.println(i+s); // No error
基本上,适用于任何对象或任何非字符串原始类型和字符串组合。
我想知道是哪家公司? :)
i = i + s
会将它们转换为int
,从而导致编译错误。 - skynet这个东西并不总是会给你编译错误。
如果你正在做这样的事情:
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);
}
}
x + y
也会失败,而不仅仅是 x += y
。 - nikhil