我注意到惊讶的行为:
我可以这样写:
Integer integer = 0;
integer++;
但我不能这样写:
getInteger()++;
如果
public static Integer getInteger(){
return 0;
}
对我来说,两个片段看起来都一样。
但第二个片段产生:
unexpected type
getInteger()++;
^
required: variable
found: value
为什么第二种结构是禁止的?
通常在代码中我被迫编写像这样丑陋的结构:
obj.set(obj.get()+1);
看起来多余。
答案 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
,即可分配变量而不是value
。 getInteger()
的结果是后者。
如果是第一次测试:
Integer integer = 0; integer++;
Java的自动装箱允许使用++
运算符,但这只是因为Java自动将Integer
转换为int
然后再转回,因为变量integer
是lvalue
。它或多或少等同于:
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();