任何想法,为什么我需要在这里投入整数文字(int)?
在下面的例子中
int i = -128; Integer i2 = (Integer) i; // compiles Integer i3 = (Integer) -128; /*** Doesn't compile ***/ Integer i4 = (Integer) (int) -128; // compiles Integer i4 = -128; // compiles Integer i5 = (int) -128; // compiles Integer i6 = (Integer) (-128); // compiles Integer i7 = (Integer) 0-128; // compiles
(Integer)
我不能施放-128
,但我可以施放(int) -128
。
我一直以为-128
是int
types,并且用(int)
强制转换应该是多余的。
与i3
一致的错误是
cannot find symbol variable Integer
我尝试了Java 6更新29和Java 7更新1。
编辑:你得到相同的行为+128
而不是-128
。 它似乎是一元运算符和二元运算符之间的混淆。
编译器试图从(Integer)
减去128
而不是将-128
为Integer
。 加()
来修复它
Integer i3 = (Integer) -128; // doesn't compile Integer i3 = (Integer) (-128); // compiles
根据BoltClock在评论中投给int
意思,因为它是一个保留字,因此不能被解释为一个标识符,这对我来说是有意义的。
Bringer128发现了JLS参考文献15.16 。
CastExpression: (PrimitiveType Dims opt )UnaryExpression (ReferenceType)UnaryExpressionNotPlusMinus
正如你所看到的,转换为原始types需要任何UnaryExpression
,而转换为引用types需要UnaryExpressionNotPlusMinus
。 这些是在JLS 15.15的CastExpression之前定义的。
我find了JLS的参考。 15.16 。
CastExpression: (PrimitiveType Dims opt )UnaryExpression (ReferenceType)UnaryExpressionNotPlusMinus
正如你所看到的,转换为原始types需要任何UnaryExpression
,而转换为引用types需要UnaryExpressionNotPlusMinus
。 这些是在JLS 15.15的CastExpression之前定义的。
您需要将演员arrays更改为原始types:
... (int) -128;
或者,您可以将expression式右侧的expression式更改为非加减一元expression式:
... (Integer) (-128); // Either ... (Integer) 0 - 128; // Or
编译器将-
作为两个减号运算符来解释,即它试图从其他一些名为Integer
数字中减去128,但是范围中没有这样的variables。
这编译:
Integer i3 = (Integer) (-128)
这可能与语法分析有关。 注意到
Integer i4 = (Integer) (-128);
工作得很好。
一般来说,你不应该投射到Integer类。 这涉及到所谓的自动装箱,并可能会导致您的代码中的一些微妙的错误。 做你想做什么的首选方法是:
Integer i6 = Integer.valueOf(-128)
它将它parsing为Integer <minus operator> 128
而不是findvariablesInteger
。 您需要将-128
括在括号中:
Integer i3 = (Integer) (-128); // compiles
Integer i3 = (Integer) (-128);
问题是-
编译器将其视为运算符。
第3行被解释为你试图从括号中的expression式中扣除128,而括号中的expression式不是和inttypes的expression式(将' – '作为' – '运算符)。 如果您将expression式更改为:
Integer i3 = (Integer) (-128);
那么编译器就会明白' – '是指示负整数的一元减号。
C#编译器具有相同的行为。 它给出了一个更好的提示,为什么它不能编译:
要转换为负值,您必须将该值括在括号内