在以下示例中
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
我无法使用-128
投射(Integer)
,但我可以投放(int) -128
。
我一直认为-128
属于int
类型,并且使用(int)
投放它应该是多余的。
i3
行上的错误是
cannot find symbol variable Integer
我尝试使用Java 6 update 29和Java 7 update 1。
编辑:您使用+128
代替-128
获得相同的行为。它似乎在一元运算符和二元运算符之间存在混淆。
答案 0 :(得分:151)
编译器尝试从128
中减去(Integer)
,而不是将-128
转换为Integer
。添加()
以修复它
Integer i3 = (Integer) -128; // doesn't compile
Integer i3 = (Integer) (-128); // compiles
根据BoltClock在评论中,int
的演员按预期工作,因为它是一个保留字,因此不能被解释为标识符,这对我来说很有意义。
Bringer128找到了JLS参考15.16。
CastExpression: ( PrimitiveType Dimsopt ) UnaryExpression ( ReferenceType ) UnaryExpressionNotPlusMinus
如您所见,转换为基本类型需要UnaryExpression
,而转换为引用类型则需要UnaryExpressionNotPlusMinus
。这些是在JLS 15.15的CastExpression之前定义的。
答案 1 :(得分:48)
我找到了JLS参考。 15.16
CastExpression: ( PrimitiveType Dimsopt ) UnaryExpression ( ReferenceType ) UnaryExpressionNotPlusMinus
如您所见,转换为基本类型需要UnaryExpression
,而转换为引用类型则需要UnaryExpressionNotPlusMinus
。这些是在JLS 15.15的CastExpression之前定义的。
您需要将演员表更改为基本类型:
... (int) -128;
或者您可以将演员表右侧的表达式更改为非正负一元表达式:
... (Integer) (-128); // Either
... (Integer) 0 - 128; // Or
答案 2 :(得分:12)
编译器将-
解释为two-arg减运算符,即它试图从名为Integer
的其他数字中减去128,但是范围内没有这样的变量。
编译:
Integer i3 = (Integer) (-128)
答案 3 :(得分:9)
这可能与语法分析有关。注意
Integer i4 = (Integer) (-128);
工作正常。
通常,您不应该转换为Integer类。这涉及一种称为自动装箱的东西,并且可能会在代码中引起一些细微的错误。 做你想做的首选方法是:
Integer i6 = Integer.valueOf(-128)
答案 4 :(得分:9)
它将其解析为Integer <minus operator> 128
而未找到变量Integer
。您需要将-128
括在括号中:
Integer i3 = (Integer) (-128); // compiles
答案 5 :(得分:7)
Integer i3 = (Integer) (-128);
问题是-
编译器将其视为运算符。
答案 6 :(得分:6)
第3行被解释为你试图从括号中的表达式中扣除128并且括号中的表达式不是和int类型的表达式(它将' - '视为' - '运算符)。如果将表达式更改为:
Integer i3 = (Integer) (-128);
然后编译器将理解' - '是指示负整数的一元减号。
答案 7 :(得分:3)
C#编译器具有相同的行为。它提供了一个更好的提示,但为什么它无法编译:
要投射负值,您必须将值括在括号中