任何想法为什么我需要在这里将整数文本转换为(int)?

2022-08-31 08:54:08

在以下示例中

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

我一直认为是类型,用它铸造应该是多余的。-128int(int)

行上的错误是i3

cannot find symbol variable Integer

我尝试使用Java 6 update 29和Java 7 update 1。

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


答案 1

编译器尝试从 中减去 而不是强制转换为 。添加以修复它128(Integer)-128Integer()

Integer i3 = (Integer) -128; // doesn't compile
Integer i3 = (Integer) (-128); // compiles

根据BoltClock在评论中的说法,cast按预期工作,因为它是一个保留字,因此不能被解释为标识符,这对我来说是有道理的。int

Bringer128找到了JLS参考15.16

 CastExpression:
    ( PrimitiveType Dimsopt ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus

如您所见,强制转换为基元类型需要任何 ,而强制转换为引用类型需要 。这些是在JLS 15.15的CastExpression之前定义的。UnaryExpressionUnaryExpressionNotPlusMinus


答案 2

我找到了JLS参考。15.16.

 CastExpression:
    ( PrimitiveType Dimsopt ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus

如您所见,强制转换为基元类型需要任何 ,而强制转换为引用类型需要 。这些是在JLS 15.15的CastExpression之前定义的。UnaryExpressionUnaryExpressionNotPlusMinus

您需要将强制转换更改为基元类型:

... (int) -128;

或者,您可以将强制转换右侧的表达式更改为非正负一元表达式:

... (Integer) (-128);  // Either
... (Integer) 0 - 128; // Or