55

我在一次采访中遇到了这个问题,无法提出解决方案。我知道反之亦然,如“+=”运算符在 Java 中的作用是什么?

所以问题如下。

..... x = .....;
..... y = .....;

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

4 回答 4

55

试试这个代码

Object x = 1;
String y = "";

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

不完全确定为什么会这样,但编译器说

运算符 += 未定义参数类型 Object、String

我假设第二行toString是在对象上调用的。

编辑:

这是有道理的,因为+=运算符在一般对象上毫无意义。在我的示例中,我将 int 转换为 Object,但它仅取决于xObject 类型:

Object x = new Object();

它只在x是 Object 时才有效,所以我实际上认为 String 是 Object 的直接子类。这将失败x + y

Foo x = new Foo();

对于我尝试过的其他类型。

于 2011-11-15T14:37:49.317 回答
3

这不可能。

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

于 2011-11-15T16:13:58.397 回答
2
int  i = 5;
String s = "a";
System.out.println(i+=s);  //Error
System.out.println(i+s);   // No error

基本上,适用于任何对象或任何非字符串原语和字符串组合。

我想知道是哪家公司?:)

于 2011-11-16T18:27:57.243 回答
1

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

如果你正在做这样的事情:

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 连接起来。

于 2011-11-21T13:28:26.453 回答