知道为什么我需要将整数文字转换为(int)吗?

时间:2011-10-26 08:14:30

标签: java syntax casting

在以下示例中

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获得相同的行为。它似乎在一元运算符和二元运算符之间存在混淆。

8 个答案:

答案 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#编译器具有相同的行为。它提供了一个更好的提示,但为什么它无法编译:

  

要投射负值,您必须将值括在括号中