【问题标题】:How do you declare x and y so that x+=y gives a compilation error and x=x+y not?你如何声明 x 和 y 以便 x+=y 给出编译错误而 x=x+y 没有?
【发布时间】:2011-12-29 13:54:01
【问题描述】:

我在一次采访中遇到了这个问题,但无法提出解决方案。我知道反之亦然,如What does the "+=" operator do in Java?所示

所以问题如下。

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

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

【问题讨论】:

  • 奇怪的是,java 允许与加号连接吗?我不知道java,但这似乎是一种可能性
  • @mazzzzz 刚刚测试过,似乎不是这里的解决方案。 += 可以很好地连接两个字符串。
  • 一个没用的面试题。
  • @Jonathon - 这取决于它是否被要求找出受访者是否知道答案 - 这没用。但是看看某人对一个愚蠢的面试问题的反应,或者看看他们如何在这样的问题上大声工作,也许有提示,看看他们是否有任何语言律师能力——这些都是值得的。
  • “让我们看看他是否会去 StackOverflow 上提问。如果他这样做了,那么我们就雇用他,因为在实际项目中,这将是正确和适当的行为!”

标签: java operators shorthand


【解决方案1】:

试试这个代码

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

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

【讨论】:

  • 谢谢。我在 Eclipse 中试过,就像你说的那样。但我意识到在 NetBeans 中它只是编译而没有任何错误。那么,这是否意味着它不是 java 的普遍问题,而是取决于编译器?
  • x+=y 如果 x 是 Object 并且 y 是 String 则应该编译,参见 bugs.sun.com/bugdatabase/view_bug.do?bug_id=7058838
  • 是的,它依赖于编译器,因为问题是如何以这种方式导致编译器错误。 Java 语言本身可能不允许这种事情发生,但编译器可能无法正确实现规范。所以这不是一个很明确的问题,而且是非常可怕的面试问题
  • 这是一个 JAVA 棘手的问题...最好称之为魔术问题 ;-)
【解决方案2】:

这是不可能的。

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

【讨论】:

  • 有可能,看@Craigy的回答。
【解决方案3】:
int  i = 5;
String s = "a";
System.out.println(i+=s);  //Error
System.out.println(i+s);   // No error

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

不知道是哪家公司? :)

【讨论】:

  • 这并不完全等价,因为在这里它们被转换为字符串,而在第二种情况下它们将被转换为inti = i + s,这会导致编译错误。
【解决方案4】:

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

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

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

【讨论】:

  • 但在这种情况下x + y 也会失败,而不仅仅是x += y
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多