为什么我不能增加返回值?

时间:2014-07-11 12:22:35

标签: java return-value increment

我注意到惊讶的行为:

可以这样写:

Integer integer = 0;
integer++;

但我不能这样写:

getInteger()++;

如果

public static Integer getInteger(){
        return 0;
    }

对我来说,两个片段看起来都一样。

但第二个片段产生:

unexpected type
        getInteger()++;
                  ^
  required: variable
  found:    value

为什么第二种结构是禁止的?

通常在代码中我被迫编写像这样丑陋的结构:

obj.set(obj.get()+1);

看起来多余。

5 个答案:

答案 0 :(得分:7)

x++x + 1不同。它是x += 1的缩写,即x = x + 1;增量,然后分配。所以getInteger()++表示getInteger() = getInteger() + 1,这没有任何意义。您将一个值添加到一个值,而不是递增变量。

除此之外,++适用于int但不适用Integer,但即使您返回int,也无法使用++增加class Test { static public void main() { getint()++; } static int getint() { int a = 0; return a; } } }:

Test.java:3: error: unexpected type
        getint()++;
              ^
  required: variable
  found:    value

给出

{{1}}

(在C ++中,您可以使用引用来完成此工作,但Java没有这些。)

答案 1 :(得分:2)

8 ++没有意义,而

int x=8;
x++;

确实有意义 因为x ++的工作方式与x+=1类似,即x=x+1 并且8=8+1是不可接受的。

答案 2 :(得分:1)

正如它所说,++运算符需要变量++递增存储在某处的值,因此递增的值现在存储在该位置。您的函数只返回,这不是变量

它与Rahul在评论中提到的一样简单。

//This works
x=5;
x++; //Now x=6 since x++ is equivalent to x=x+1;

//This doesn't work
5++; //this doesn't even make sense, trying to do 5=5+1??

//similarly, getNumber() is just a value that is returned, it is a value, not a variable
//So it is like the second case
//This doesn't work
getNumber()++; //Trying to do getNumber()=getNumber()+1; ??

答案 3 :(得分:0)

您没有返回int,而是返回Integer个对象。 Integer类是不可变的,并且没有自己的++运算符。

此外,++运算符要求其操作数为lvalue,即可分配变量而不是valuegetInteger()的结果是后者。

如果是第一次测试:

Integer integer = 0; integer++;

Java的自动装箱允许使用++运算符,但这只是因为Java自动将Integer转换为int然后再转回,因为变量integerlvalue。它或多或少等同于:

int tmp_int = integer.intValue();
int result = tmp_int++;
integer = Integer.getInteger(tmp_int);
(void)result;                      

result - 表达式的有效“值”不是integer,因为您使用了++的“后增量”版本,因此结果是值<{1}}在之前增加了

答案 4 :(得分:0)

  

为什么第二种结构是禁止的?

Integer是不可变的,所以无论如何都无法改变它。 int是可变的,但因为它只返回值上的副本,所以这也不起作用。

e.g。

public static Integer getInteger(){
    return 0;
}

// what would this do
getInteger()++;

// now the method has been changed to 
public static Integer getInteger(){
    return 0+1;
}
// so now
System.out.println(getInteger()); // prints 1 ??
  

obj.set(obj.get()+ 1);

这也破坏了封装。我会建议像这样的方法

AtomicInteger i = new AtomicInteger(0);
i.incrementAndGet();

或者您可以拥有自己的

i.incr();