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);
}
}