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

Java 如何声明x和y以使x+=y给出编译错误,x=x+;不是吗?,java,operators,shorthand,Java,Operators,Shorthand,我在一次采访中遇到了这个问题,没有找到解决办法。我知道反之亦然,如所示 问题如下 ..... 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 不完全确定为什么会这样,但编译器说 未为参数类型对象Strin

我在一次采访中遇到了这个问题,没有找到解决办法。我知道反之亦然,如所示

问题如下

..... 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
不完全确定为什么会这样,但编译器说

未为参数类型对象String定义运算符+=

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

编辑:

这是有意义的,因为
+=
操作符在一般对象上没有意义。在我的示例中,我将int转换为一个对象,但它只取决于
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造成如此惊人差异的一个缺陷

(一)

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


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

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

如果你这样做的话:

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等。

奇怪的是,java允许用加号连接吗?我不懂java,但这似乎是一个很好的例子possibility@mazzzzz刚刚测试过,似乎不是这里的解决方案连接两个字符串很好。这是一个多么无用的面试问题啊。@Jonathon-这取决于是否有人询问面试者是否知道答案-这将是无用的。但是看看某人对愚蠢的面试问题的反应,或者看看他们在这个问题上是如何大声工作的,也许是通过暗示,看看他们是否有语言律师的能力——这些都是值得的。“让我们看看他是否去问关于StackOverflow的问题。如果他这样做了,那么让我们雇用他,因为在实际项目中,这将是正确和适当的行为!“谢谢。我在Eclipse中尝试过,正如你所说的。但我意识到在NetBeans中它只是编译,没有任何错误。那么,这是否意味着它不是java的一般问题,而是取决于编译器?如果x是对象,y是字符串,那么x+=y应该编译,是的,它依赖于编译器,因为问题是如何导致编译器错误以这种方式。Java语言本身可能不允许发生这种事情,但编译器可能无法正确实现规范。因此,这不是一个真正明确的问题,也是一个非常可怕的访谈问题。这是一个Java棘手的问题……最好称之为神奇的问题;-)这并不是真正等价的,因为它们在这里被转换当字符串转换为
int
时,在第二种情况下,
i=i+s
会产生编译错误。这是可能的,请参阅@Craigy的答案。但在这种情况下,
x+y
也会失败,而不仅仅是
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);
}
}