任何想法,为什么我需要在这里投入整数文字(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

我一直以为-128inttypes,并且用(int)强制转换应该是多余的。

i3一致的错误是

 cannot find symbol variable Integer 

我尝试了Java 6更新29和Java 7更新1。

编辑:你得到相同的行为+128而不是-128 。 它似乎是一元运算符和二元运算符之间的混淆。

编译器试图从(Integer)减去128而不是将-128Integer 。 加()来修复它

 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#编译器具有相同的行为。 它给出了一个更好的提示,为什么它不能编译:

要转换为负值,您必须将该值括在括号内