2012-01-06 17 views
2

明示的な変換は、同じタイプのパフォーマンスに影響しますか、コンパイラによってフィルタリングされ、バイトコードに到達しませんか?同じタイプへの明示的変換

例:

int x = 3; 
int y = (int) x; 
+0

なぜこれを行う必要がありますか? –

+0

@HarryJoy私は、警告を生成しないので、このような奇妙な状況でのコンパイラの動作については不思議です。 – Acidic

+0

私は本当に会話をしましたか?ハハ!編集していただきありがとうございます。 – Acidic

答えて

3

public class SameTypeCastsDemo { 

    public static void withoutCasts() { 
     int x = 2; 
     int y = x; 
     System.out.println(y); 
    } 

    public static void withCast() { 
     int x = 2; 
     int y = (int) x; 
     System.out.println(y); 
    } 

} 

をバイトコードが同じに見えることを示しています

public static void withoutCasts(); 
    Code: 
    0: iconst_2 
    1: istore_0 
    2: iload_0 
    3: istore_1 
    4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    7: iload_1 
    8: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 
    11: return 

public static void withCast(); 
    Code: 
    0: iconst_2 
    1: istore_0 
    2: iload_0 
    3: istore_1 
    4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    7: iload_1 
    8: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 
    11: return 

更新:非プリミティブオブジェクト参照を持つ:

public class SameTypeCastsDemo { 
    Integer x; 
    Integer y; 

    public SameTypeCastsDemo(Integer x, Integer y) { 
     this.x = x; 
     this.y = y; 
    } 

    public void print() { 
     System.out.println(y); 
    } 

    public static void withoutCasts() { 
     SameTypeCastsDemo x = new SameTypeCastsDemo(2, 3); 
     SameTypeCastsDemo y = x; 
     y.print(); 
    } 

    public static void withCast() { 
     SameTypeCastsDemo x = new SameTypeCastsDemo(2, 3); 
     SameTypeCastsDemo y = (SameTypeCastsDemo) x; 
     y.print(); 
    } 

} 

javap -c SameTypeCastsDemo:

public static void withoutCasts(); 
    Code: 
    0: new #6; //class SameTypeCastsDemo 
    3: dup 
    4: iconst_2 
    5: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    8: iconst_3 
    9: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    12: invokespecial #8; //Method "<init>":(Ljava/lang/Integer;Ljava/lang/Integer;)V 
    15: astore_0 
    16: aload_0 
    17: astore_1 
    18: aload_1 
    19: invokevirtual #9; //Method print:()V 
    22: return 

public static void withCast(); 
    Code: 
    0: new #6; //class SameTypeCastsDemo 
    3: dup 
    4: iconst_2 
    5: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    8: iconst_3 
    9: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
    12: invokespecial #8; //Method "<init>":(Ljava/lang/Integer;Ljava/lang/Integer;)V 
    15: astore_0 
    16: aload_0 
    17: astore_1 
    18: aload_1 
    19: invokevirtual #9; //Method print:()V 
    22: return 
+0

これはオブジェクト参照にも当てはまると思いますか? – Acidic

1

太陽リンクからidentity conversion.

--quoteそれを呼び出し - その同じ型の型からの変換は、任意のタイプのために許可されている

これは些細かもしれませんが、実際には2つの結果があります。まず、 式は、 で始まる所望の型を常に持つことができます。したがって、すべての式 は、単純な識別変換であれば、すべての式が変換の対象になるという単純なルールが可能です。 第2に、明確にするために、プログラムに の冗長キャスト演算子を含めることが許可されていることを意味します。このクラスでてjavap -cを実行している

関連する問題