8

可能重复:
知道为什么我需要在这里将整数文字转换为 (int) 吗?

package typecastingpkg;

public class Main
{        
    public static void main(String[] args)
    {
       byte a=10;
       Integer b=(int)-a;
       System.out.println(b);

       int x=25;
       Integer c=(Integer)(-x); // If the pair of brackets around -x are dropped, a compile-time error is issued - illegal start of type.
       System.out.println(c);

       Integer d=(int)-a;     //Compiles fine. Why does this not require a pair of braces around -a?
       System.out.println(d);
    }
}

在此代码中,-x将原始类型int转换为包装器类型Integer时,会产生编译时错误illegal start of type

Integer c=(Integer)-x;

它需要一对-x像这样的牙套Integer c=(Integer)(-x);

然而,下面的表达式编译得很好。

Integer d=(int)-a;

为什么这个不需要-a像前面的表达式那样需要一对大括号?

4

3 回答 3

11

编译器认为,在表达式(Integer)-x中,您试图x从名为 的变量中减去Integer,因此由于没有定义这样的变量而出现错误。(int)-x之所以有效,是因为int它是原始类型的保留关键字,不能用作变量名,因此编译器可以推断出您正在尝试强制转换,而不是减法。

于 2012-10-09T21:37:23.767 回答
5

可以通过检查 Java 的语法找到答案:

CastExpression:
    ( PrimitiveType ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus

这告诉您可以使用强制转换表达式,例如(int) -x;因为int是原始类型,因此您可以在其后使用一元表达式。但是,如果您使用一个对象,那么它就是 aReferenceType并且唯一跟在 a之后的ReferenceTypeUnaryExpressionNotPlusMinus,它不包括诸如-xor之类的东西+x

UnaryExpressionNotPlusMinus:
    PostfixExpression
    ~ UnaryExpression
    ! UnaryExpression
    CastExpression

这个禁止的原因是它Integer本身可以被解释为一个标识符,这会导致歧义。int不能解释为已识别,因为它是保留字。要解决这种歧义,您必须将一元表达式括在括号中。

于 2012-10-09T21:45:01.267 回答
1

您不能将原始类型转换为类,反之亦然。

您可以将基元转换为其他基元。在这种情况下,值精度可能会丢失。例如,如果您将 long 转换为 int。

您还可以将对象转换为其他类型。

实际上,从 java 1.5 开始,通过自动装箱允许将原始包装器类型分配给原始数据,这可能会造成混淆。这只是一个编译器糖。当你说

Integer a = 5;编译器将其翻译为Integer a = new Integer(5);

如果你说那

int b = a;你真的说int b = a.intValue();

不幸的是,像 +、- 等运算符不适用于原始包装器。只有原语支持它们。所以,你不能说-a。你必须说(-1)*a.intValue()。现在可以将此值分配给 int 或 Integer 变量:自动装箱将完成这项工作。

于 2012-10-09T21:42:25.627 回答