我在一次采访中遇到了这个问题,无法提出解决方案。我知道反之亦然,如“+=”运算符在 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
我假设第二行toString
是在对象上调用的。
编辑:
这是有道理的,因为+=
运算符在一般对象上毫无意义。在我的示例中,我将 int 转换为 Object,但它仅取决于x
Object 类型:
Object x = new Object();
它只在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合法。
在反面,可能#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
基本上,适用于任何对象或任何非字符串原语和字符串组合。
我想知道是哪家公司?:)
这东西不会总是给你编译错误
如果你正在做这样的事情:
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 连接起来。