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から減算しようとしていると見なします。したがって、そのような変数が定義されていないため、エラーが発生します。はプリミティブ型の予約済みキーワードであり、変数名として使用できないため機能します。したがって、コンパイラは、減算ではなくキャストしようとしていると推測できます。xInteger(int)-xint

于 2012-10-09T21:37:23.767 に答える
5

答えは、 Javaの文法を調べることで見つけることができます。

CastExpression:
    ( PrimitiveType ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus

(int) -x;これは、がプリミティブ型であるため、のようなキャスト式を使用できることを示していますint。したがって、それに続く単項式を使用できます。ただし、オブジェクトを使用する場合、それはReferenceTypeaであり、aに続くのReferenceTypeは、またはUnaryExpressionNotPlusMinusのようなものを含まない唯一のものです。-x+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 に答える